MYSQL資料匯出備份、匯入的幾種方式
第一種 mysqldump:
這是mysql自帶的備份命令,提供了很多擴充套件引數可供選擇,工作中常用此方式
常用語法:
mysqldump[options] database [tables,多個表用空格隔開]
--databases [options] BD1 [DB2..多個庫用空格隔開]
--all-databases [options]
匯出(備份): 匯出庫 > SQL檔案(本地匯入匯出不需要-P3306 -h 192.168.1.25)(-q –e寫法可以合併)
mysqldump -P 3306 -h 192.168.1.25 -uroot -p -q -e base_push > C:\Users\thinkive\Desktop\base_push20170921.sql
-P 3306 -h 192.168.1.25 是遠端mysql地址和埠
-uroot 是遠端使用者名稱為root
base_push 是遠端庫名
以上是匯入匯出資料的語句,該方法15分鐘匯出1.6億條記錄,匯出的檔案中平均7070條記錄拼成一個insert語句,通過source進行批量插入,匯入1.6億條資料耗時將近5小時。平均速度:3200W條/h。後來嘗試加上--single-transaction引數,結果影響不大。另外,若在匯出時增加-w引數,表示對匯出資料進行篩選,那麼匯入匯出的速度基本不變,篩選出的資料量越大,時間越慢而已。對於其中的引數這裡進行說明:
[options]引數 | 含義 |
-q , --quick | 在匯出大表時很有用,它強制 mysqldump 從伺服器查詢取得記錄直接輸出而不是取得所有記錄後將它們快取到記憶體中 |
-c | 是在insert中增加具體的欄位名。這樣對目的表結構不同原表,情況下更有用 |
-e , --extended-insert | 用具有多個VALUES列的INSERT語法。這樣使匯出檔案更小,並加速匯入時的速度。預設為開啟狀態,使用--skip-extended-insert取消選項 |
-t | 僅匯出表資料,不匯出表結構 |
--opt –d | 僅匯出表結構 |
-R , --routines | 匯出儲存過程以及自定義函式。 |
--triggers | 匯出觸發器,預設啟用 |
-E , --events | 匯出事件 |
--single-transaction | 該選項在匯出資料之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程式且能保證匯出時資料庫的一致性狀態。它只適用於多版本儲存引擎,僅InnoDB。本選項和--lock-tables 選項是互斥的,因為LOCK TABLES 會使任何掛起的事務隱含提交。要想匯出大表的話,應結合使用--quick 選項。在本例子中沒有起到加快速度的作用 |
--master-data=[1/2] | 如果值等於1,就會新增一個CHANGE MASTER語句(二進位制檔案的名稱和位置) -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
如果加入此配置,mysql說Binlogging on server not active,解決方案如下: Linux:需要在/etc/my.cnf裡的[mysqlid]下方加入: log-bin=mysql-bin 再重啟 Windows:mysql安裝目錄下my.ini檔案,如上操作 |
--all-databases , -A | 匯出全部資料庫 |
--add-drop-database | 每個資料庫建立之前新增drop資料庫語句。 |
--add-drop-table | 每個資料表建立之前新增drop資料表語句。(預設為開啟狀態,使用--skip-add-drop-table取消選項) |
-w , --where | 過濾條件,只支援單表資料條件匯出 mysqldump –ubackup –p –master-data=2 –where "id>10 and id<20" orderdb order > order.sql |
如果想要看更多的擴充套件引數可以看官網介紹
[all options] https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
匯入: 庫 < SQL檔案(本地匯入匯出不需要-P 3306 -h 192.168.1.25)
mysql -P 3306 -h 127.0.0.1 -uroot -p base_push < C:\Users\thinkive\Desktop\base_push.sql
遠端埠 遠端ip 使用者名稱 庫名 匯入檔案路徑
第二種 mysqlpump:
與mysqldump相比:
支援基於表的並行匯出功能(引數--default-parallelism,預設為2,引數--parallel-schemas,控制並行匯出的庫)
匯出的時候帶有進度條(引數--watch-progress,預設開啟)
支援直接壓縮匯出匯入(壓縮演算法引數--compress-output=zlib或lz4 (生成同樣字尾名檔案,zlib速度較lz4快,體積也較小,解壓縮:zlib_decompress input_file(如intput.zlib) output_file(如output.sql) lz4類似(為mysql5.7.10命令) 不推薦使用,解壓縮後資料不完全)
注:
mysqldump匯出的檔案沒有庫的限制(以及建庫語句等),所以可以遷入與牽出庫名不同.
mysqlpump匯出的庫建表有庫名的限制(預設也含建庫語句),所以遷入庫不需要建立(但需要與遷出庫名相同)
對比測試:
1.mysqlpump(支援多程式)壓縮備份test資料庫(21G)三個併發執行緒備份,消耗時間:2m42.515s,gzip壓縮率要比LZ4大
mysqlpump -uroot -p -h127.0.0.1 --single-transaction--default-character-set=utf8 --compress-output=LZ4 --default-parallelism=3 -Btest | gzip > d:\temp\mysqlpump.test.gz
2.mysqldump(單程式)壓縮備份test資料庫(21G),消耗時間:28m9.930s,gzip壓縮率要比LZ4大(gzip命令需要在linux環境使用)
mysqldump -uroot -p -h127.0.0.1 --default-character-set=utf8 -P3306 --skip-opt--add-drop-table --create-options --quick --extended-insert--single-transaction -B test | gzip >/data/mysql/mysql3306/data/test_db.sql.gz
3.mydumper壓縮備份test資料庫(21G),開三個併發執行緒,消耗時間:10m10.207s
mydumper -u test -h 127.0.0.1 -p safe2016 -P 3306 -t 3 -c -B test -o /data/mysql/mysql3306/data/
4.mydumper壓縮備份test資料庫(21G),三個併發執行緒備份,並且開啟對一張表多個執行緒以chunk的方式批量匯出,消耗時間:10m9.518s
mydumper -u test -h 127.0.0.1 -p safe2016 -P 3306 -t 3 -r 300000 -c -B test -o/data/mysql/mysql3306/data/
從上面看出,mysqlpump的備份效率是最快的,mydumper次之,mysqldump最差。所以在IO允許的情況下,能用多執行緒就別用單執行緒備份。並且mysqlpump還支援多資料庫的並行備份,而mydumper要麼備份一個庫,要麼就備份所有庫。
由於實際情況不同,測試給出的速度提升只是參考。到底開啟多少個並行備份的執行緒,這個看磁碟IO的承受能力,若該伺服器只進行備份任務,可以最大限制的來利用磁碟.
mysqlpump的並行匯出功能的架構為:佇列+執行緒,允許有多個佇列,每個佇列下有多個執行緒,而一個佇列可以繫結1個或者多個資料庫。但是,對於每張表的匯出只能是單個執行緒的
mydumper支援一張表多個執行緒以chunk的方式批量匯出,這在主鍵是隨機的情況下,匯出速度還能有提升
MySQL 5.7.11版本解決了一致性備份問題,推薦線上環境使用
mysql壓縮成gz方式匯入與匯出(linux環境) 一定資料:匯出成sql格式:63MB, gz格式:2.78MB
mysqlpump [options] –B database_name | gzip> /opt/database_name.sql.gz
gunzip < backupfile.sql.gz | mysql -u使用者名稱 -p密碼(也可不輸入)資料庫名
命令示例(--compress-output=zlib壓縮引數必須相應生成壓縮檔案,linux環境`>`前可加`| gzip`生成相應gz檔案,不然為sql):
mysqlpump –P 3306 -h192.168.1.189 -uroot -p--single-transaction --default-character-set=utf8 --default-parallelism=3
-B thinkive_base_push > D:\Administrator\Desktop\thinkive.sql
[all options] https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html
選項 | Description | 介紹 |
在每個CREATE DATABASE語句之前新增DROP DATABASE語句 |
| |
在每個CREATE TABLE語句之前新增DROP TABLE語句 |
| |
在每個CREATE USER語句之前新增DROP USER語句 |
| |
用LOCK TABLES和UNLOCK TABLES語句環繞每個錶轉儲 |
| |
轉儲所有資料庫 |
| |
使用指定的網路介面連線到MySQL伺服器 |
| |
安裝字符集的目錄 |
| |
使用包含列名稱的完整INSERT語句 |
| |
壓縮客戶端和伺服器之間傳送的所有資訊 |
| |
輸出壓縮演算法,zlib或lz4(生成同樣檔案,zlib速度較lz4快,體積也較小), 預設不壓縮,生成sql檔案; 如使用此引數,須指定生成的壓縮檔案副檔名 | ||
--databases / -B | 匯出指定多個庫,如mysqlpump--databases db_name1 db_name2 ... 匯出指定庫的多個表,如mysqlpump db_name tbl_name1 tbl_name2 |
|
編寫除錯日誌 |
| |
程式退出時列印除錯資訊 |
| |
列印程式退出時的除錯資訊,記憶體和CPU統計資訊 |
| |
身份驗證外掛使用 |
| |
指定預設字符集 |
| |
並行處理的預設執行緒數(較mysqldump新增) |
| |
除了通常的選項檔案外,還要讀取已命名的選項 |
| |
只讀取命名的選項檔案 |
| |
選項組字尾值 |
| |
對於重新載入,將索引建立推遲到載入錶行之後 |
| |
從轉儲的資料庫轉儲事件 |
| |
要從轉儲中排除的資料庫 |
| |
要從轉儲中排除的事件 |
| |
從轉儲中排除的例程 |
| |
要從轉儲中排除的表 |
| |
觸發器從轉儲中排除 |
| |
使用者從轉儲中排除 |
| |
使用多行INSERT語法 |
| |
顯示幫助資訊並退出 |
| |
使用十六進位制符號轉儲二進位制列 |
| |
主機連線到(IP地址或主機名) |
| |
要包含在轉儲中的資料庫 |
| |
包含在轉儲中的事件 |
| |
包含在轉儲中的例程 |
| |
要包含在轉儲中的表 |
| |
觸發器包含在轉儲中 |
| |
使用者包含在轉儲中 |
| |
寫INSERT IGNORE而不是INSERT語句 |
| |
將警告和錯誤附加到指定的檔案 |
| |
閱讀.mylogin.cnf中的登入路徑選項 |
| |
傳送到伺服器或從伺服器接收的最大資料包長度 |
| |
TCP / IP和套接字通訊的緩衝區大小 |
| |
不要寫CREATE DATABASE語句(如果遷出庫名與原庫名不一致),預設包含建庫 |
| |
不要編寫重新建立每個轉儲表的CREATE TABLE語句 |
| |
讀取任何選項檔案 |
| |
指定模式處理並行性 |
| |
連線到伺服器時使用的密碼 |
| |
安裝外掛的目錄 |
| |
用於連線的TCP / IP埠號 |
| |
列印預設選項 |
| |
使用連線協議 |
| |
編寫REPLACE語句而不是INSERT語句 |
| |
直接輸出到給定的檔案 |
| |
從轉儲的資料庫轉儲儲存的例程(過程和函式) |
| |
不要以舊(4.1之前)格式傳送密碼到伺服器 |
| |
新增SET NAMES default_character_set來輸出 |
| |
是否新增SET @@ GLOBAL.GTID_PURGED輸出 | 5.7.18 | |
在單個事務中轉儲表(5.7.9後--default-parallelism多執行緒才能與其合用,且其與--add-locks互斥) |
| |
從檢視和儲存的程式CREATE語句中刪除DEFINER和SQL SECURITY子句 |
| |
不要轉儲錶行 |
| |
用於連線到localhost,要使用的Unix套接字檔案 |
| |
啟用加密連線 |
| |
包含受信任的SSL證照頒發機構列表的檔案 |
| |
包含可信SSL證照頒發機構證照檔案的目錄 |
| |
包含X509證照的檔案 |
| |
連線加密允許的密碼列表 |
| |
包含證照吊銷列表的檔案 |
| |
包含證照撤銷列表檔案的目錄 |
| |
包含X509金鑰的檔案 |
| |
伺服器連線的安全狀態 | 5.7.11 | |
根據伺服器證照通用名稱身份驗證主機名稱 |
| |
允許加密連線的協議 | 5.7.10 | |
每個轉儲表的轉儲觸發器 |
| |
新增SET TIME_ZONE ='+ 00:00'轉儲檔案 |
| |
連線到伺服器時使用的MySQL使用者名稱 |
| |
轉儲使用者帳戶 |
| |
顯示版本資訊並退出 | 5.7.9 | |
顯示進度指示器 |
|
第三種 通過data資料資料夾內容進行備份、還原:
直接複製data資料資料夾下相應庫和ibdata1檔案遷移到新庫中(新庫最好是空白的,以免資料覆蓋),筆者在遷移新電腦時 裝完mysql,就懶得把原機器mysql中的各個庫像前列方法那樣拷貝遷移,所以索性直接複製原機器的data下資料檔案替換到新電腦的mysql相應路徑,經測試,沒有問題.
相關文章
- 批量備份還原匯入與匯出MongoDB資料方式昝璽MongoDB
- MySql資料庫備份的幾種方式MySql資料庫
- 資料庫 MySQL 資料匯入匯出資料庫MySql
- MySQL 資料庫定時備份的幾種方式MySql資料庫
- MySQL入門--匯出和匯入資料MySql
- MySQL 8:備份&匯入【備忘】MySql
- 簡單介紹mysql中資料庫覆蓋匯入的幾種方式MySql資料庫
- Mysql 資料庫匯入與匯出MySql資料庫
- Mongodb的備份恢復與匯出匯入MongoDB
- Linux mysql 備份和匯入命令LinuxMySql
- 【MySQL】白話說MySQL(五),資料的匯出與匯入MySql
- mysqldump壓縮備份匯出匯入(含定期備份shell指令碼)MySql指令碼
- oracle 備份資料庫,匯出資料庫Oracle資料庫
- Mysql匯入&匯出MySql
- SQLServer匯出匯入資料到MySQLServerMySql
- Docker容器中的備份、恢復、遷移、匯入、匯出Docker
- sqoop用法之mysql與hive資料匯入匯出OOPMySqlHive
- 幾種結匯方式分享
- MongoDB 資料遷移 備份 匯入(自用)MongoDB
- sqoop資料匯入匯出OOP
- Oracle 資料匯入匯出Oracle
- 資料泵匯出匯入
- Oracle資料匯入匯出Oracle
- phpMyAdmin匯入/匯出資料PHP
- MySQL資料的匯出MySql
- MySQL資料的匯入MySql
- Mongodb資料的匯出與匯入MongoDB
- 匯入和匯出AWR的資料
- EasyPoi, Excel資料的匯入匯出Excel
- mysql匯出資料MySql
- Navicat、into outfile、mysql命令、mysqldump、mysqlpump、mydumper匯出匯入資料MySql
- Oracle資料庫匯入匯出。imp匯入命令和exp匯出命令Oracle資料庫
- Excel資料快速匯入mysql的幾個辦法ExcelMySql
- SQL資料庫的匯入和匯出SQL資料庫
- Oracle資料泵的匯入和匯出Oracle
- CommonJS的兩種匯出方式JS
- [Docker核心之容器、資料庫檔案的匯入匯出、容器映象的匯入匯出]Docker資料庫
- oracle資料匯出匯入(exp/imp)Oracle