带有布尔列的aws dms问题

eqzww0vc  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(295)

我正在尝试使用dms启用复制,将auroramysql示例作为源,将redshift示例作为目标。在布尔列上复制失败。我已经在mysql示例中将布尔列声明为位(1)。根据文档,mysql中的布尔列应定义为位:
https://docs.aws.amazon.com/dms/latest/userguide/chap_source.mysql.html#chap_source.mysql.datatypes
如果我删除布尔列,它就会工作。我还尝试将列定义为布尔值。这也不管用。
这就是我得到的错误:
2018-08-26t16:59:19[target\u apply]e:retcode:sql\u error sqlstate:42804 nativeerror:30消息:[amazon][amazon redshift](30)尝试执行查询时出错:[sqlstate 42804]错误:列“state”的类型为boolean,但表达式的类型为character variable,提示:您需要重写或强制转换表达式[1022502](银币:4428)

vfh0ocws

vfh0ocws1#

我陷入了同样的问题,但我迁移了我的基地,所以我解决了一个后脚本,可能可以帮助你。此外,您还可以使用dms事件通知sms,然后调用lambda来实现这一点。
使用node只需运行file.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')
}
a0x5cqrl

a0x5cqrl2#

这是dms的一个bug。这只在正在进行的复制期间发生,而不是在满负载时。在从auroramysql复制到redshift的过程中,布尔值被强制转换为varchar,从而导致上面的错误。

相关问题