第一種 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 選項。在本例子中沒有起到加快速度的作用
mysqldump -uroot -p --host=localhost --all-databases --single-transaction
--master-data=[1/2]
如果值等於1,就會添加一個CHANGE MASTER語句(二進制文件的名稱和位置)
如果值等於2,就會在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
介紹
--add-drop-database
在每個CREATE DATABASE語句之前添加DROP DATABASE語句
--add-drop-table
在每個CREATE TABLE語句之前添加DROP TABLE語句
--add-drop-user
在每個CREATE USER語句之前添加DROP USER語句
--add-locks
用LOCK TABLES和UNLOCK TABLES語句環繞每個表轉儲
--all-databases
轉儲所有數據庫
--bind-address
使用指定的網絡接口連接到MySQL服務器
--character-sets-dir
安裝字符集的目錄
--complete-insert
使用包含列名稱的完整INSERT語句
--compress
壓縮客戶端和服務器之間發送的所有信息
--compress-output
輸出壓縮算法,zlib或lz4(生成同樣文件,zlib速度較lz4快,體積也較小), 默認不壓縮,生成sql文件; 如使用此參數,須指定生成的壓縮文件擴展名
--databases / -B
導出指定多個庫,如mysqlpump--databases db_name1 db_name2 ...
導出指定庫的多個表,如mysqlpump db_name tbl_name1 tbl_name2
--debug
編寫調試日志
--debug-check
程序退出時打印調試信息
--debug-info
打印程序退出時的調試信息,內存和CPU統計信息
--default-auth
身份驗證插件使用
--default-character-set
指定默認字符集
--default-parallelism
並行處理的默認線程數(較mysqldump新增)
--defaults-extra-file
除了通常的選項文件外,還要讀取已命名的選項
--defaults-file
只讀取命名的選項文件
--defaults-group-suffix
選項組后綴值
--defer-table-indexes
對於重新加載,將索引創建推遲到加載表行之后
--events
從轉儲的數據庫轉儲事件
--exclude-databases
要從轉儲中排除的數據庫
--exclude-events
要從轉儲中排除的事件
--exclude-routines
從轉儲中排除的例程
--exclude-tables
要從轉儲中排除的表
--exclude-triggers
觸發器從轉儲中排除
--exclude-users
用戶從轉儲中排除
--extended-insert
使用多行INSERT語法
--help
顯示幫助信息並退出
--hex-blob
使用十六進制符號轉儲二進制列
--host
主機連接到(IP地址或主機名)
--include-databases
要包含在轉儲中的數據庫
--include-events
包含在轉儲中的事件
--include-routines
包含在轉儲中的例程
--include-tables
要包含在轉儲中的表
--include-triggers
觸發器包含在轉儲中
--include-users
用戶包含在轉儲中
--insert-ignore
寫INSERT IGNORE而不是INSERT語句
--log-error-file
將警告和錯誤附加到指定的文件
--login-path
閱讀.mylogin.cnf中的登錄路徑選項
--max-allowed-packet
發送到服務器或從服務器接收的最大數據包長度
--net-buffer-length
TCP / IP和套接字通信的緩沖區大小
--no-create-db
不要寫CREATE DATABASE語句(如果遷出庫名與原庫名不一致),默認包含建庫
--no-create-info
不要編寫重新創建每個轉儲表的CREATE TABLE語句
--no-defaults
讀取任何選項文件
--parallel-schemas
指定模式處理並行性
--password
連接到服務器時使用的密碼
--plugin-dir
安裝插件的目錄
--port
用於連接的TCP / IP端口號
--print-defaults
打印默認選項
--protocol
使用連接協議
--replace
編寫REPLACE語句而不是INSERT語句
--result-file
直接輸出到給定的文件
--routines
從轉儲的數據庫轉儲存儲的例程(過程和函數)
--secure-auth
不要以舊(4.1之前)格式發送密碼到服務器
--set-charset
添加SET NAMES default_character_set來輸出
--set-gtid-purged
是否添加SET @@ GLOBAL.GTID_PURGED輸出
5.7.18
--single-transaction
在單個事務中轉儲表(5.7.9后--default-parallelism多線程才能與其合用,且其與--add-locks互斥)
--skip-definer
從視圖和存儲的程序CREATE語句中刪除DEFINER和SQL SECURITY子句
--skip-dump-rows
不要轉儲表行
--socket
用於連接到localhost,要使用的Unix套接字文件
--ssl
啟用加密連接
--ssl-ca
包含受信任的SSL證書頒發機構列表的文件
--ssl-capath
包含可信SSL證書頒發機構證書文件的目錄
--ssl-cert
包含X509證書的文件
--ssl-cipher
連接加密允許的密碼列表
--ssl-crl
包含證書吊銷列表的文件
--ssl-crlpath
包含證書撤銷列表文件的目錄
--ssl-key
包含X509密鑰的文件
--ssl-mode
服務器連接的安全狀態
5.7.11
--ssl-verify-server-cert
根據服務器證書通用名稱身份驗證主機名稱
--tls-version
允許加密連接的協議
5.7.10
--triggers
每個轉儲表的轉儲觸發器
--tz-utc
添加SET TIME_ZONE ='+ 00:00'轉儲文件
--user
連接到服務器時使用的MySQL用戶名
--users
轉儲用戶帳戶
--version
顯示版本信息並退出
5.7.9
--watch-progress
顯示進度指示器
第三種 通過data數據文件夾內容進行備份、還原:
直接復制data數據文件夾下相應庫和ibdata1文件遷移到新庫中(新庫最好是空白的,以免數據覆蓋),筆者在遷移新電腦時 裝完mysql,就懶得把原機器mysql中的各個庫像前列方法那樣拷貝遷移,所以索性直接復制原機器的data下數據文件替換到新電腦的mysql相應路徑,經測試,沒有問題.
————————————————
版權聲明:本文為CSDN博主「沒有永恆」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_18406563/article/details/80215751