有沒有更快的方式去產生 MySQL 與 PostgreSQL 的資料庫副本?

edited 十月 2013 in 資料庫
因為要測試有點大的資料庫(~200MB)移轉,MySQL -> PostgreSQL ,每次用 SQL 語法匯出、匯入就要很久時間,但是測試動作又不能夠只做個幾次,所以開始想辦法縮短複製一個資料庫所需時間。

在 MySQL 好像除了每個資料表去執行 CREATE TABLE db2.table1 SELECT * FROM db1.table1 之外沒有更快的?透過 mysqldump 中間都會有大量的 SQL 解析時間。

在 PostgreSQL 可以透過 CREATE DATABASE db2 WITH TEMPLATE db1; ,速度比透過 psql 匯入快非常多

有更好的建議嘛?

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=5591

評論

  • edited 十二月 2010
    PostgreSQL我不熟
    mysql的話比較快的方法就是....目錄自己建檔案自己copy過去 權限改正確就可以了
  • edited 十二月 2010
    可是... innodb ...
  • edited 十二月 2010
    這有個用 Script 去做, 作者說比 mysqldump快一些
    http://stackoverflow.com/questions/25794/mysql-copy-duplicate-database

    如果是用innodb 最後一行要改為以下內容
    echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME

    #!/bin/bash

    DBUSER=user
    DBPASSWORD=pwd
    DBSNAME=sourceDb
    DBNAME=destinationDb
    DBSERVER=db.example.com

    fCreateTable=""
    fInsertData=""
    echo "Copying database ... (may take a while ...)"
    DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
    echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
    echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
    for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
    createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
    fCreateTable="${fCreateTable} ; ${createTable}"
    insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
    fInsertData="${fInsertData} ; ${insertData}"
    done;
    echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME


  • edited 十二月 2010
    PostgreSQL可以透過copy的方式匯入資料(據官方說法會比較快)
    例如已經事先建立好一個table1包含col1,col2,col3這三個欄位

    在PostgresSQL的sql中
    COPY table1 FROM '/data/dump_data';

    在/data/dump_data這個檔案資料呈現方式
    data11 data12 data13
    data21 data22 data23

    空白的部份是用tab字元分隔
    如果資料部份有包含tab字元必須要\t取代
    像這樣
    data11\tdata data12 data13

  • edited 十二月 2010
    感恩,@morris 這個 script 執行內容就是我提到的方式,叫出每個資料表,然後逐一 copy 過去 :)
  • edited 十二月 2010
    innodb的話 似乎只看到整個db用檔案備份到另一個mysql去
    同mysql似乎只能dump
Sign In or Register to comment.