1. 程式人生 > >Mysql 匯入實戰

Mysql 匯入實戰

這個幾天公司遷移預覽版資料庫,當前公司使用的是 Mysql 資料庫,版本為 5.6。遷移的資料庫大小也不算很大,2G 多一點,總體以小表為主,就幾張表資料比較大,有業務記錄表達到了 150W 的數量級,我一開始不以為然,直接將所有的表以 sql 檔案的方式匯出,然後再使用 Navicat 直接執行 sql 檔案的方式匯入。最後發現花費了很長時間也沒有匯入,於是回家研究了一下 Mysql 的匯入匯出,希望以後遇到這樣的問題可以用得上。

1.首先修改 mysql 配置檔案

max_allowed_packet = 256M
innodb_flush_log_at_trx_commit = 0

MySQL 會根據配置檔案會限制 server 接受的資料包的大小。如果寫入大資料時,因為預設的配置太小,插入和更新操作會因為 max_allowed_packet

引數限制,而導致失敗。
max_allowed_packet 如果不設定,預設值在不同的 MySQL 版本表現不同,有的版本預設1M,有的版本預設4M。所以首先修改 max_allowed_packet 大小為 256M。

innodb_flush_log_at_trx_commit 引數
0:log buffer 將每秒一次地寫入 log file 中,並且 log file 的 flush(刷到磁碟)操作同時進行。該模式下在事務提交的時候,不會主動觸發寫入磁碟的操作。
1:每次事務提交時 MySQL 都會把 log buffer 的資料寫入 log file,並且 flush(刷到磁碟)中去,該模式為系統預設。
2:每次事務提交時 MySQL 都會把 log buffer 的資料寫入 log file,但是 flush(刷到磁碟)操作並不會同時進行。該模式下,MySQL 會每秒執行一次 flush(刷到磁碟)操作。

當設定為 0,該模式速度最快,但不太安全,mysqld 程序的崩潰會導致上一秒鐘所有事務資料的丟失。
當設定為 1,該模式是最安全的,但也是最慢的一種方式。在 mysqld 服務崩潰或者伺服器主機 crash 的情況下,binary log 只有可能丟失最多一個語句或者一個事務。。
當設定為 2,該模式速度較快,也比 0 安全,只有在作業系統崩潰或者系統斷電的情況下,上一秒鐘所有事務資料才可能丟失。

1.直接執行 sql 檔案

速度慢,很慢,適合量很少的情況。

2.登入mysql後使用source命令

mysql -u<使用者名稱> -p<密碼>
mysql> use dbname;
mysql> source filename;

相較於第一種方式,速度明顯快了很多,但任然很慢,在我的電腦上 5 分鐘匯入了 66W 條資料。

3.使用 mysql 命令列

mysql -u root - p dbname < filename

5分鐘大約 80w 的資料,比前一種方法稍微快了一些。
10 分鐘大約 110W 的資料。
20 分鐘大約 160W 的資料,單表大小 1.2G。

4.使用 load data infile 方法

select * into outfile 'account.txt' fields terminated by ',' from va_account;

153W 行 1.1G 花費20s

LOAD DATA INFILE 'account.txt' INTO TABLE va_account;

使用 load data 後花費 7'12s 將資料倒完,和網上的平均的速度差距很大(6000W/h),隨後思考為什麼使用 load data 的方式還是很慢。最後發現是表中的索引花費了匯入的時間。將索引刪除,我這裡這張表是 3 個索引,刪除後匯入只花費 1 分鐘左右,匯入速度明顯提升。

總結

使用 sql 執行的方式最慢,可能花費幾個小時也無法將 150W 的資料匯入,使用 load data infile 方法最快,分分鐘將龐大的資料匯入資料庫。但是 load data infile 一次只能備份和匯入一張表(或許是我沒有找到多表同時的方法),所以我以後匯入資料的方式使用方法 3 加方法 4 結合的方式匯入和匯出。將表中資料大的表單個匯入匯出,其他使用命令列的方式匯入。

本文由個人 hexo 部落格 co2fe.com 遷移
date: 2018-09-17 18:34:31