3

ほとんど同じ構造を持ち、同じ Web アプリのデータを表す 2 つの mysql データベースがありますが、そのうちの 1 つは現在のバージョンを表し、もう 1 つはずっと前に作成されたものです。

内部に両方のダンプがあるが、最初のデータベースのテーブルには old_ プレフィックスを、2 番目のデータベースのテーブルには new_ プレフィックスを使用してデータベースを作成するにはどうすればよいですか?

プレフィックスまたはその他のソリューションを設定するための mysqldump オプションはありますか?

4

7 に答える 7

2

「mysqldumpファイル」はSQLステートメントでいっぱいの単なるテキストファイルなので、テキストエディタでこのような簡単な変更を加えることができます。

1)2つのデータベースを個別にダンプします。

2)「古い」ダンプファイルを編集します。

  • 正しいuse mydatabase;行を追加します
  • 検索と置換を実行してold_、テーブル名の前に追加します。

3)次に、cat dump1 dump2 > combined_dump

4)mysql < combined_dump

于 2009-12-16T19:53:28.817 に答える
2

この sed スクリプトは、おそらくもう少し安全です。ファイルに保存し、sed -f を使用してダンプ ファイルをフィルタリングします。

s/\(-- Table structure for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
s/\(DROP TABLE IF EXISTS `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
s/\(CREATE TABLE `\)\([^`]\+\)\(` (\)/\1xyzzy_\2\3/
s/\(-- Dumping data for table `\)\([^`]\+\)\(`\)/\1xyzzy_\2\3/
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` DISABLE KEYS \*\/\)/\1xyzzy_\2\3/
s/\(LOCK TABLES `\)\([^`]\+\)\(` WRITE\)/\1xyzzy_\2\3/
s/\(INSERT INTO `\)\([^`]\+\)\(` VALUES (\)/\1xyzzy_\2\3/
s/\(\/\*!40000 ALTER TABLE `\)\([^`]\+\)\(` ENABLE KEYS \*\/\)/\1xyzzy_\2\3/

xyzzy_ を検索して、目的のテーブル プレフィックスに置き換えます。

于 2010-03-22T02:21:34.890 に答える
1
  1. 両方のデータベースをそのまま復元します。
  2. 次のストアド プロシージャを使用して、プレフィックスを追加した後、すべてのテーブルを 1 つの DB から別の DB に移動します。
  3. 移動後、ソース データベースを削除します。

このストアド プロシージャは、MySQL のインメモリ テーブルからテーブル リストを取得information_schemaし、コマンドを使用して別の DB に自動的に移動しRENAMEます。

DELIMITER $$

USE `db`$$

DROP PROCEDURE IF EXISTS `renameDbTables`$$

CREATE DEFINER=`db`@`%` PROCEDURE `renameDbTables`(
    IN from_db VARCHAR(20),
    IN to_db VARCHAR(30),
    IN to_name_prefix VARCHAR(20)
)
BEGIN
/*
call db.renameDbTables('db1','db2','db_'); 
db1.xxx will be renamed to db2.db_xxx
*/
    DECLARE from_state_table VARCHAR(20) DEFAULT '';
    DECLARE done INT DEFAULT 0;
    DECLARE b VARCHAR(255) DEFAULT '';
    DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES 
        WHERE TABLE_SCHEMA=from_db;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    OPEN cur1;

    REPEAT
        FETCH cur1 INTO from_state_table;
        IF NOT done THEN
--          select from_state_table;
            SET @QUERY = '';
            SET @QUERY = CONCAT(@QUERY,'RENAME TABLE ',from_db,'.', from_state_table,' TO ',to_db,'.', to_name_prefix, from_state_table,';');
--          SELECT @query;
            PREPARE s FROM @QUERY;
            EXECUTE s;
            DEALLOCATE PREPARE s;
        END IF;
    UNTIL done END REPEAT;
    CLOSE cur1;
    END$$

DELIMITER ;
于 2009-12-16T20:36:42.173 に答える
0

私は過去に以下を使用して行ったmysqldumpことsedがありますが、一度に1つのテーブルに対してのみ有効である可能性があることを認めます。

$ mysqldump -u user --password=mypass MyDB MyTable | sed s/MyTable/old_Mytable/ | mysql -u other_user -p NewDB

コマンドのリストを使用してシェルスクリプトを作成できます(テーブルごとに1つ)。または、別のユーザーがこれを変更して、複数のテーブルに対して1回のショットで効果的に機能するようにする方法があります。

ピア

于 2009-12-16T20:00:55.863 に答える
0

それらを異なるデータベースにインポートします。彼らは と と呼ばれているとnewdbしましょうolddb。次に、次のように table1 を old_table1 にコピーできます。

insert into newdb.old_table1
select *
from olddb.table1

膨大な数のテーブルがある場合は、それらをコピーするスクリプトを生成します。

select concat('insert into newdb.old_',  table_name,
    'select * from olddb.', table_name, ';')
from information_schema.tables
where table_schema = 'olddb'
于 2009-12-16T19:51:18.643 に答える
0

問題を誤解しているかもしれませんが、2 つのデータベースを 1 つの SQL ファイルにダンプして、古いテーブルを 1 つのスキーマに入れ、新しいテーブルを別のスキーマに入れ、データベースを復元するために使用したいようです。

それがあなたがやろうとしていることである場合、最も簡単な方法は、各ダンプの前に適切な「use database」コマンドを挿入することです。

そのようです:

echo "use old_db;" > /tmp/combined_dump.sql
mysqldump old_db >> /tmp/combined_dump.sql
echo "use new_db;" >> /tmp/combined_dump.sql
mysqldump new_db >> /tmp/combined_dump.sql
于 2009-12-16T20:54:48.223 に答える