4

mysqldumpを使用して、MySQLデータベースの正規のインストールスクリプトを作成しています。データベース内のテーブルの可能な半分のデータをダンプしたいのですが、他のテーブルからデータを除外します。私は次の2つのコマンドを知っています。

- データなし

--ignore-table

ただし、前者はすべてのテーブルに適用され、後者はテーブル内のデータだけでなく、テーブルをダンプから完全に除外すると思います(たとえば、createステートメント)。mysqldumpを使用して私の目標を達成する方法を知っている人はいますか?

編集:

ほぼ重複する質問が見つかりました:mysqldumpは構造全体ですが、単一のコマンドで選択したテーブルからのデータのみです

4

4 に答える 4

4

への 2 つの別々の呼び出しを実行するのはどうmysqldumpですか? データベースを作成し、データが必要ないテーブルを無視するためのもの。もう 1 つは、データなしで残りのテーブルを作成するだけです。2 つのスクリプトを個別に実行することも、連結して最終的なスクリプトを作成することもできます。

于 2010-10-22T18:36:44.307 に答える
2

(それ自体への 1 回の呼び出しでmysql) すべてを完了する別のオプションが 1 つありますが、おそらく決して試みるべきではありません。

HP Lovecraft に敬意を表して (そして、 INSERT ステートメントを作成するためのAnuyaのストアド プロシージャに基づいて)、呼び出してはならないストアド プロシージャを次に示します。

注:この不浄で難解なストアド プロシージャは、狂人によってのみ実行され、純粋に教育目的で以下に示されています。

DELIMITER $$
DROP PROCEDURE IF EXISTS `pseudoDump` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pseudoDump`(
  in_db varchar(20),
  in_tables varchar(200),
  in_data_tables varchar(200)
)
BEGIN
DECLARE Whrs varchar(500);
DECLARE Sels varchar(500);
DECLARE Inserts varchar(200);
DECLARE tablename varchar(20);
DECLARE ColName varchar(20);
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME IN ( in_tables );
tabdumploop: LOOP
  SHOW CREATE TABLE tablename;
  LEAVE tabdumploop;
END LOOP tabdumploop;
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db ;
datdumploop: LOOP
  SELECT group_concat(concat('concat(\'"\',','ifnull(',column_name,','''')',',\'"\')')) INTO @Sels from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SELECT group_concat('`',column_name,'`') INTO @Whrs from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SET @Inserts=concat("select concat('insert IGNORE into ", in_db,".",tablename," values(',concat_ws(',',",@Sels,"),');') as MyColumn from ", in_db,".",tablename, " where 1 group by ",@Whrs, ";");
  PREPARE Inserts FROM @Inserts;
  EXECUTE Inserts;
  LEAVE datdumploop;
END LOOP datdumploop;
END $$
DELIMITER ;

... ありがたいことに、この手順がMySQL バグ #44009によって確実に引き起こされるに違いない魂を痛めつける恐怖を目の当たりにすることから救われました...

于 2010-10-22T20:03:56.830 に答える
0
mysqldump -u user -h host.example.com -p database table1 table2 table3
于 2010-10-22T18:29:42.790 に答える
0

あなたはここであなたが必要とするものを見つけるかもしれません:

http://www.electrictoolbox.com/mysqldump-selectively-dump-data/

whereステートメントを使用することは、おそらくあなたがやろうとしていることを達成するための最も簡単な方法です。

于 2010-10-22T18:30:02.693 に答える