Проблема с AWS DMS с логическим столбцом - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь включить репликацию с DMS, используя в качестве источника экземпляр Aurora mySQL и в качестве места назначения экземпляр Redshift.Сбой репликации на логических столбцах.Я объявил логический столбец как BIT (1) в экземпляре mySQL.Согласно документации, логические столбцы в MySQL должны быть определены как BIT:

https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.DataTypes

Если я удаляю логический столбец, он работает.Я также попытался определить столбец как логический.Это тоже не сработало.

Это ошибка, которую я получаю:

2018-08-26T16: 59: 19 [TARGET_APPLY] E: RetCode: SQL_ERROR SqlState: 42804NativeError: 30 Сообщение: [Amazon] [Amazon Redshift] (30) Произошла ошибка при попытке выполнить запрос: [SQLState 42804] ОШИБКА: столбец «состояние» имеет тип логический, но выражение имеет тип символа, меняющийся, СОВЕТ: Вы будетенужно переписать или привести выражение.[1022502] (ar_odbc_stmt.c: 4428)

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Я застрял в той же проблеме, но я перенес свою базу, поэтому решил с помощью пост-скрипта, который может помочь вам. Кроме того, вы можете использовать события DMS для уведомления SMS, а затем вызвать лямбду, чтобы сделать это.

Используя узел, просто запустите файл.js init ()


const AWS = require("aws-sdk");

AWS.config.update({
    region: "us-east-1"    
});

const documentClient = new AWS.DynamoDB.DocumentClient();

let invalidList = [];

const TableName = 'TableName';
const params = {
    TableName: TableName,
};

module.exports.init = function () {
    console.log("Start Conversions of Details Booleans")

    documentClient.scan(params, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("Scan succeeded.");

            // By default scan retrieves at max 1 mb of data
            if (typeof data.LastEvaluatedKey != "undefined") {
                console.log("Scanning for more...");
                params.ExclusiveStartKey = data.LastEvaluatedKey;
                documentClient.scan(params, onScan);
            }

            invalidList = getinvalidList(data);

            if(invalidList.length == 0) {
                console.log("All data is aready migrated");
                return;
            }

            updateList(invalidList);
        }
    });
};

function getinvalidList(list) {
    return list.Items.reduce((invalidList, item) => {
        if (item) {
            const variable = (item.variable && item.variable != undefined) ? item.variable : '0'; 

            if (isNotBoolean(variable)) {
                invalidList.push(item);
            } 
        }

    return invalidList;
    }, []);
}

function updateList(list) {
    list.forEach(item => {                
        var params = {
            TableName: TableName,         
            Key: {
                "id": item.id,
            },
            UpdateExpression: "set variable = :variable",
            ExpressionAttributeValues: {
                ":variable": newValue(item.variable),
            },
            ReturnValues: "UPDATED_NEW"
        };

        documentClient.update(params, function(err, data) {
            if (err) console.log(err);
            else console.log(data);
        },
    )
    });
}

function newValue(variable) {    
    return isNotBoolean(variable) ? !!+variable : variable
}

function isNotBoolean(variable) {
    return (typeof variable !== 'boolean')
}
0 голосов
/ 30 августа 2018

Оказывается, это ошибка DMS.Это происходит только во время текущей репликации, а не при полной загрузке.Во время репликации из Aurora MySql в Redshift логическое значение преобразуется в Varchar, что приводит к ошибке, описанной выше.

...