データベースをDMSツールを使用してAmazonのRDSに移行しています。ソースデータベースでauto_incrementとしてマークされた列がターゲットデータベースでauto_incrementとしてマークされなかったことを除いて、ほとんどすべてが見栄えがします。また、インデックスと外部キー制約が含まれていないことにも気付きました。両端でバージョン5.6を実行しています。
データベースの完全な作成テーブルをDMSに含める方法はありますか?
DMSが宛先にテーブルを作成するように指示された場合(デフォルトのオプション)、生データを移動するために必要な最も基本的な構造のみを作成します。したがって、デフォルト値のような他のメタデータも移動されることを信頼すべきではありません。
データの移動後にすべての変更を移行するか、最初に宛先でスキーマを作成して、DMSにテーブルを作成しないように指示することができます。
インデックスを使用してデータを同時にコピーすると処理が非常に遅くなるため、大量のデータがある場合は後で作成するか、単に同期を待つだけでよいことに注意してください。
同じ問題に直面し、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();