Mysql

從一個 MySQL 表複製到同一數據庫的另一個 MySQL 表

  • December 26, 2016

我在 MySQL 表中有大約 4000 萬行,我想將此表複製到同一數據庫中的另一個表中。這樣做最有效的方法是什麼?需要多少時間(大約)?

假設您有mydb.mytb並且想要創建mydb.mytbcopy

我有五(5)種方法來做這個副本

方法#1

mysql客戶端中,執行以下命令

USE mydb
CREATE TABLE mytbcopy LIKE mytb;
INSERT INTO mytbcopy SELECT * FROM mytb;

方法#2

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb | mysql ${MYSQL_CONN} -Dtest
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

方法#3

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysql ${MYSQL_CONN} -ANe"CREATE DATABASE IF NOT EXISTS test"
mysqldump ${MYSQL_CONN} mydb mytb > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dtest < ${DUMPFILE}
rm -f ${DUMPFILE}
mysql ${MYSQL_CONN} -ANe"ALTER TABLE test.mytb RENAME mydb.mytbcopy"

方法#4

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

方法#5

DUMPFILE=/some/path/tabledata.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} mydb mytb | sed 's/mytb/mytbcopy' > ${DUMPFILE}
mysql ${MYSQL_CONN} -Dmydb < ${DUMPFILE}
rm -f ${DUMPFILE}

分析

  • 方法#1在步驟方面是最簡單的,但需要將 4000 萬行推送到一個事務中。這將是 InnoDB 儲存引擎上最繁重的任務。

  • 對於其他方法,mysqldump 將發送 4000 萬行中的數千行

    • 方法 #2方法 #3將 mysqldump 表到測試數據庫中。在測試數據庫中創建表後,隨後將其重命名並移動到原始數據庫中
    • APPROACH #4APPROACH #5使用sed針對來自 mysqldump 的流重命名表,因為它回顯了 INSERT 命令
    • APPROACH #2APPROACH #4使用管道而不是輸出文件
    • 方法 #3方法 #5使用輸出文件進行後續重新載入

如果要復製mydb.mytb到已經存在的表中mydb.mytbcopy,並且兩個表具有相同的結構:

方法#6

INSERT INTO mytbcopy SELECT * FROM mytb;

與**#APPROACH 1一樣,#APPROACH 6**將具有 4000 萬行的單個事務

方法 #7

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump ${MYSQL_CONN} -t mydb mytb | sed 's/mytb/mytbcopy' | mysql ${MYSQL_CONN} -Dmydb

這種方法不會丟棄表。它只是生成插入

結語

我不能給你一個時間估計,因為我不知道數據庫伺服器的組成、表結構、索引佈局等等。

試一試 !!!

引用自:https://dba.stackexchange.com/questions/72042