web-dev-qa-db-ja.com

AWS DMSはauto_incrementなしでテーブルを作成します

データベースをDMSツールを使用してAmazonのRDSに移行しています。ソースデータベースでauto_incrementとしてマークされた列がターゲットデータベースでauto_incrementとしてマークされなかったことを除いて、ほとんどすべてが見栄えがします。また、インデックスと外部キー制約が含まれていないことにも気付きました。両端でバージョン5.6を実行しています。

データベースの完全な作成テーブルをDMSに含める方法はありますか?

5
InfernoTK

DMSが宛先にテーブルを作成するように指示された場合(デフォルトのオプション)、生データを移動するために必要な最も基本的な構造のみを作成します。したがって、デフォルト値のような他のメタデータも移動されることを信頼すべきではありません。

データの移動後にすべての変更を移行するか、最初に宛先でスキーマを作成して、DMSにテーブルを作成しないように指示することができます。

インデックスを使用してデータを同時にコピーすると処理が非常に遅くなるため、大量のデータがある場合は後で作成するか、単に同期を待つだけでよいことに注意してください。

5
Elliot Chance

同じ問題に直面し、1つずつ進むにはテーブルが多すぎるため、SQLストアドプロシージャを作成して作業を行いました。すべてのテーブルについて、主キーを取得し、主キーが単一の列である場合、 %int%と入力し、自動インクリメントを追加します。

あなたはコードを見つけることができます ここ

私には約550のテーブルがあり、プロセスは非常に高速でした。さらに多くの場合は、複数のサブクエリを使用するこの設定を改善する必要があり、パフォーマンスを気にしません。

DROP TABLE if exists temp;

CREATE TABLE temp (
  `table` varchar(250) DEFAULT NULL,
  `colum` varchar(250) DEFAULT NULL,
  `type` varchar(250) DEFAULT NULL,
  `number_of_PK` tinyint(2) DEFAULT NULL,
  `alter` varchar(250) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP PROCEDURE IF EXISTS foo;

DELIMITER //

CREATE PROCEDURE foo()

BEGIN

    declare tableName varchar(250);
    declare done int default 0;
    declare totalKeys int default 0;
    declare columnName varchar(250);
    declare columnType varchar(250);

    #select all the #tables but exclude the ones generated by AED DMS
    declare cur1 cursor for SELECT Distinct(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME not LIKE "awsdms_%";
    declare continue handler for not found set done=1;

    open cur1;

    igmLoop: loop

        fetch cur1 into tableName;

        set @cnt = 0;
        #SElECT all the tables-colum-datatype
        SELECT `total`,`column_name_`, `data_type_` into totalKeys, columnName, columnType FROM (
            SELECT MAX(rowNumber) as total,  `column_type_`, `data_type_` , `column_name_` FROM (
                SELECT (@cnt := @cnt + 1) AS rowNumber, `column_name_`, `column_type_`, `data_type_` FROM (
                    SELECT 
                        c.COLUMN_NAME as `column_name_`, cls.COLUMN_TYPE as `column_type_`, DATA_TYPE as `data_type_`
                        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS p 
                        JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
                            ON  c.TABLE_NAME = p.TABLE_NAME
                            AND c.CONSTRAINT_NAME = p.CONSTRAINT_NAME
                        JOIN INFORMATION_SCHEMA.COLUMNS cls
                            ON  c.TABLE_NAME = cls.TABLE_NAME
                            AND c.COLUMN_NAME = cls.COLUMN_NAME
                        WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
                        AND c.TABLE_NAME = tableName
                        group by c.COLUMN_NAME
                    ) a                 
                ) b
            ) c;

        SET @t1 = CONCAT("ALTER table ", tableName," modify ", columnName," ", columnType," NOT NULL AUTO_INCREMENT");
        #log it
        insert into temp values (tableName, columnName, columnType, totalKeys, @t1 );
        if totalKeys = 1 and columnType like "%int%" then
                #update the row
            PREPARE stmt3 FROM @t1;
            EXECUTE stmt3;
        end if; 

    if done = 1 then leave igmLoop; end if; 

    end loop igmLoop;

    close cur1;


END //

DELIMITER ; 

call foo();
3
Carlos Robles