4

これはおそらく長い道のりですが、データベースレイアウト全体(テーブル、ビュー、プロシージャ、すべて)を、ストアドプロシージャ内のクエリまたは複数のクエリで複製することは可能ですか?

基本的に、このようなmysqldumpを使用する場合と同じ機能を探します

# mysqldump -u root -ppassword --no-data --routines dbname > file
  //create database copyofdbname
# mysql -u root -ppassword copyofdbname < file

外部ツールなしでmysqlプロシージャでこれを行うことは可能ですか?

「showtables」を使用してテーブルを作成し、結果を反復処理して、各テーブルの「create table」状態を取得し、それらを新しいデータベースに転送できると思います。
これは単なる推測ですが、この方法でデータベースからストアドプロシージャをコピーする方法がわかりません。

4

2 に答える 2

3

基本的にいいえ、MYSqlには重複データベース機能がありません。いくつかの外部ツールはそうかもしれませんが、私が知っているものはありません。このプロセスはphpを使用して実行しましたが、ストアドプロシージャまたはその他の中間層アプリケーションを使用して実行できると確信しています。これが私がハイレベルで行ったステップです。各ステップの実行方法の詳細を知っていると思います。

  1. 新しいDBを作成します
  2. そのデータベースのすべてのテーブルをクエリします。information_schemaにアクセスできたので、そこから選択しました。
  3. テーブルをループします。
    1. このようなものを実行しますCREATE TABLE dbnew.tableA LIKE dbold.tableAそれはテーブルの構造を完全に複製します
    2. 古いdb/tableから*を選択して新しいdb/tableにSelectを挿入します
  4. 昼食をとるか、データベースのサイズに応じて、映画や「ITクラウド」の再放送を見る
  5. コピーしたデータベースをお楽しみください。

修正:以前にこれを行った私の調査では、データベースコマンドが重複しているバージョンのmySqlがあることがわかりましたが、バグがあり、将来のバージョンで削除されました。そのコマンドを使用できるバージョンを実行している場合でも、そのコマンドを使用するよりも、これらの手順に従う方がよいでしょう。

于 2011-06-20T21:45:44.863 に答える
1

テーブルのコピーは、この手順で機能します(新しいデータベース名を引数として)

BEGIN
    DECLARE done1 INT DEFAULT FALSE; 
    DECLARE tablename TEXT; 
    DECLARE cursortable CURSOR FOR (
        SELECT table_name
        FROM information_schema.tables
        WHERE
            table_schema='sansentinel'
        ORDER BY table_name ASC
    ); 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = TRUE;
    START TRANSACTION;
    # create db
    set @createinstance := concat("CREATE DATABASE `",INSTANCENAME,"`"); 
    prepare createinstance from @createinstance; 
    execute createinstance;

    OPEN cursortable; 
    read_loop: LOOP 
            FETCH cursortable INTO tablename; 
            IF done1 THEN 
                    LEAVE read_loop; 
            END IF; 

            set @createtable := concat("CREATE TABLE `",INSTANCENAME,"`.`",tablename,"` LIKE `sansentinel`.`",tablename,"`"); 
            prepare createtable from @createtable; 
            execute createtable;
    END LOOP; 
    CLOSE cursortable;
    COMMIT;
END
于 2012-09-16T20:44:13.503 に答える