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。