Mysql
從一個 MySQL 表複製到同一數據庫的另一個 MySQL 表
我在 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 #4和APPROACH #5使用sed針對來自 mysqldump 的流重命名表,因為它回顯了 INSERT 命令
- APPROACH #2和APPROACH #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
這種方法不會丟棄表。它只是生成插入
結語
我不能給你一個時間估計,因為我不知道數據庫伺服器的組成、表結構、索引佈局等等。
試一試 !!!