1. 程式人生 > 資料庫 >MySQL學習——備份和還原

MySQL學習——備份和還原

MySQL學習——備份和還原

摘要:本文主要學習瞭如何備份和還原資料庫。

部分內容來自以下部落格:

https://www.cnblogs.com/chenmh/p/5300370.html

常用命令

匯出資料

匯出2019年1月的資料,資料庫是ide,表是user,要求不需要匯出建庫語句,要求使用完成的插入語句,並且合併插入:

1 [root@localhost ~]# mysqldump -h 127.0.0.1 -P 3306 -uroot -p'123456' --no-create-info --databases ide --tables user \
2 > --where=" date >= '2019-01-01' and date < '2019-02-01' " --complete-insert --extended-insert > '/data/dump/201901.txt'

匯入資料

1 [root@localhost ~]# mysql -uroot -p123456 database < db_back.sql

匯出資料

匯出資料一般使用mysqldump命令在Linux系統執行。

語法

匯出全部資料庫:

1 mysqldump [OPTIONS] --all-databases [OPTIONS]

匯出指定資料庫:

1 mysqldump [OPTIONS] --databases DB1 [DB2 DB3...] [OPTIONS]

匯出指定資料庫的指定表:

1 mysqldump [OPTIONS] --database DB --tables TB [TB2 TB3...] [OPTIONS]

說明

使用者名稱:

登入資料庫的使用者名稱,當前使用者可省略該配置,“-u”後面緊跟使用者名稱,或者使用“--user=”後面緊跟使用者名稱的方式。

1 --user, -u

密碼:

登入資料庫的密碼,“-p”後面緊跟密碼,或使用“--password=”後面緊跟密碼的方式。

1 --password, -p

主機地址:

設定資料庫所在的主機地址,預設是localhost。

1 --host, -h

埠號:

設定用於連線的埠號。

1 -P, --port

連線協議:

設定使用的連線協議,取值有TCP、SOCKET、PIPE、MEMORY四種。

1 --protocol

套接字檔案:

指定當連線localhost時的套接字檔案位置,預設路徑是/tmp/mysql.sock。

1 -S, --socket

匯出全部資料庫:

1 --all-databases, -A

匯出指定資料庫:

1 --databases, -B

匯出指定表:

只能針對一個數據庫進行匯出,並且匯出的內容中沒有建立資料庫的判斷語句。

1 --tables

不匯出指定表:

指定忽略多個表時,需要重複多次,每次一個表,每個表必須同時指定資料庫和表名。

1 --ignore-table

匯出全部表空間:

1 --all-tablespaces, -Y

不匯出表空間資訊:

1 --no-tablespaces, -y

不新增建立資料庫語句:

預設新增。

1 --no-create-db, -n

新增刪除資料庫語句:

預設不新增。

1 --add-drop-database

不新增建立表語句:

預設新增。

1 --no-create-info, -t

新增刪除表語句:

預設新增,使用“--skip-add-drop-table”引數取消。

1 --add-drop-table
2 –-skip-add-drop-table

不匯出資料只匯出表結構:

1 --no-data, -d

匯出儲存過程以及自定義函式:

1 --routines, -R

在每個表匯出前鎖表並在匯出後解鎖:

預設為開啟狀態,使用“--skip-add-locks”引數取消。

1 --add-locks
2 --skip-add-locks

設定預設的字符集:

預設是utf8。

1 --default-character-set

在客戶端和伺服器之間啟用壓縮傳遞所有資訊:

1 --compress, -C

處理換行:

直接輸出到指定檔案中。該選項應該用在使用回車換行對(\\r\\n)換行的系統上(例如:DOS,Windows)。該選項確保只有一行被使用。

1 --result-file, -r

新增匯出時間:

將匯出時間新增到輸出檔案中。預設為開啟狀態,使用“--skip-dump-date”引數取消。

1 --dump-date
2 --skip-dump-date

只匯出符合指定條件的記錄:

如果條件包含命令解釋符專用空格或字元,一定要將條件引用起來。

1 --where, -w

合併多個插入語句:

預設開啟,使用“--skip-extended-insert”關閉。

1 --extended-insert
2 --skip-extended-insert

使用完整的插入語句:

使用包含列名稱的完整插入語句。這麼做能提高插入效率,但是可能會受到max_allowed_packet引數的影響而導致插入失敗。

1 --complete-insert, -c

忽略插入錯誤:

預設不新增,在插入語句中新增忽略錯誤語句。

1 --insert-ignore

伺服器傳送和接受的最大包長度:

客戶端/伺服器之間通訊的快取區的最大大小,最大為1GB。

1 --max_allowed_packet

強制插入:

在錶轉儲過程中,即使出現SQL錯誤也繼續。

1 --force, -f

例項

匯出全部資料庫:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases > db_back.sql

匯出指定資料庫:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --databases test demo > db_back.sql

匯出指定表:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --database test --tables demo user > db_back.sql

不匯出指定表:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases \
2 > --ignore-table=database.table1 --ignore-table=database.table2 > db_back.sql

設定預設字符集:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases --default-character-set=latin1 > db_back.sql

處理換行:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases --result-file=/tmp/mysqldump_result_file.txt

只匯出符合指定條件的記錄:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases --where=" id=1 limit 10"

使用完整的插入語句:

1 [root@localhost ~]# mysqldump -h127.0.0.1 -uroot -p --all-databases --complete-insert

匯入資料

匯入資料有兩種方式,一種是在Linux系統使用<命令匯入,另一種是在MySQL資料庫使用source命令匯入。

語法

在Linux系統使用<命令:

1 mysql -u使用者名稱 -p密碼 資料庫名 < 檔案路徑

在MySQL資料庫使用source命令:

1 source 檔案路徑

例項

在Linux系統使用<命令:

1 [root@localhost ~]# mysql -uroot -p123456 database < db_back.sql

在MySQL資料庫使用source命令:

1 mysql> source /home/user/data/db_back.sql

效率比較

在檔案較小的情況下,source速度比mysql高。在匯入大的檔案時,建議使用mysql命令。

優化匯入速度

對於百M級以上檔案,根據MySQL官方建議,有幾個措施可以極大提高匯入的速度。

修改配置檔案

配置如下:

1 [mysqld]
2 bulk_insert_buffer_size=2G;
3 innodb_log_buffer_size=2G;
4 innodb_autoinc_lock_mode=2;

說明:

對於MyISAM,調整系統引數:bulk_insert_buffer_size。改為至少單個檔案大小的2倍以上。

對於InnoDB,調整系統引數:innodb_log_buffer_size。改為至少單個檔案大小的2倍以上,匯入完成後可以改回預設的8M,注意不是innodb_buffer_pool_size。

有自增列的,設定:innodb_autoinc_lock_mode的值為2。

刪除索引

除主鍵外,刪除其他索引,匯入完成後重建索引。

執行批量指令碼

bash指令碼內容:

1 for SQL in *.sql;
2 do
3 echo $SQL;
4 sed -i '1i\SET autocommit=0;\nSET unique_checks=0;\nSET foreign_key_checks=0;' $SQL
5 sed -i '$a\COMMIT;\nSET autocommit=1;\nSET unique_checks=1;\nSET foreign_key_checks=1;' $SQL
6 done

說明:

關閉自動提交:autocommit=0。

關閉唯一索引檢查:unique_checks=0。

關閉外來鍵檢查:foreign_key_checks=0。