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 選項。在本例子中沒有起到加快速度的作用
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM