【问题标题】:AWS DMS Issue with boolean column布尔列的 AWS DMS 问题
【发布时间】:2019-02-01 08:28:01
【问题描述】:

我正在尝试使用 DMS 启用复制,将 Aurora mySQL 实例用作源,将 Redshift 实例用作目标。 布尔列上的复制失败。我已在 mySQL 实例上将布尔列声明为 BIT(1)。 根据文档,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: 42804 NativeError:30 消息:[Amazon][Amazon Redshift] (30) 错误 尝试执行查询时发生:[SQLState 42804] 错误: 列“状态”是布尔类型,但表达式是字符类型 变化,提示:您将需要重写或转换表达式。 [1022502] (ar_odbc_stmt.c:4428)

【问题讨论】:

    标签: mysql amazon-web-services amazon-redshift amazon-rds aws-dms


    【解决方案1】:

    这原来是 DMS 的一个错误。这仅在正在进行的复制期间发生,而不是在满载时发生。在从 Aurora MySql 复制到 Redshift 期间,布尔值被强制转换为 Varchar,从而导致上述错误。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但我迁移了我的基础,所以我用一个可能对你有帮助的后置脚本解决了这个问题。此外,您可以使用 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')
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-17
        • 1970-01-01
        • 2016-07-25
        • 1970-01-01
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        相关资源
        最近更新 更多