MySQL的幾種備份恢復
MySQL的幾種備份恢復
文章目錄
一、mysqldump
mysqldump 客戶機實用程式執行邏輯備份,生成一組 SQL 語句,可以執行這些 SQL 語句來重建原始資料庫物件定義和表資料。它可以轉儲一個或多個 MySQL 資料庫,以便備份或傳輸到另一個 SQL 伺服器, mysqldump 命令還可以生成 CSV 、其他分隔符文字或 XML 格式的輸出。
mysqldump 至少要求對 TABLE 具有 SELECT 許可權,對轉儲 VIEW 具有 SHOW VIEW ,對轉儲觸發器具有 TRIGGER ,如果不使用 --single-transaction 選項,則需要鎖定表。
1.1、使用 mysqldump 以 SQL 格式轉儲資料
mysqldump [arguments] > file_name
1.1.1、轉儲整個資料庫
mysqldump -uroot -p --all-databases --single-transaction > /mnt/20210126_all_backup.sql
1.1.2、轉儲選定資料庫
mysqldump -uroot -p --databases mysql --single-transaction > /mnt/20210127-0001_backup.sql
--databases
會導致命令列上的所有名稱都被視為資料庫名稱。如果沒有此選項,mysqldump會將名字視為資料庫名稱,將下面的名稱視為表名。使用
--all-databases
和--databases
在每個資料庫的轉儲輸出之前寫入建立資料庫和 USE 語句。這可確保在重新載入轉儲檔案時,如果每個資料庫不存在,它將建立每個資料庫,並使它成為預設資料庫,以便將資料庫內容載入到它們來自的同一個資料庫中。如果要使轉儲檔案強制刪除每個資料庫,請同時使用--add-drop-databases
選項。
1.1.3、轉儲資料庫中特定表
mysqldump -uroot -p --single-transaction cent t1 t2 [-d/-t]> /mnt/user.sql
-d:只轉儲資料庫表結構
-t:只轉儲資料庫表資料
1.1.4、
轉儲單個數據庫
mysqldump --databases test > dump.sql
在單資料庫情況下,允許省略--databases
mysqldump test > dump.sql
兩個命令的區別在於,如果沒有
--databases
,轉儲輸出不包含建立資料庫和USE語句。
- 重新載入轉儲檔案時,必須指定預設資料庫名稱,以便伺服器知道要重新載入哪個資料庫。
- 對於重新載入,可以指定不同於原始名稱的資料庫名稱,從而允許您將資料重新載入到其他資料庫中。
- 如果要重新載入的資料庫不存在,則必須先建立它。
- 由於輸出不包含
CREATE DATABASES
語句,因此--add-drop-databases
選項不起作用。如果使用它,它將不生成DROP DATABASES
語句。
1.2、重新載入 SQL 格式備份
如果轉儲檔案是由mysqldump使用--all-databases
或 --databases
選項建立的,則它包含create databases和use
語句,並且不需要指定載入資料的預設資料庫。
mysql < dump.sql
或從mysql內部使用命令:source
mysql> source dump.sql
如果檔案是一個不含建立資料庫和 USE 語句的單資料庫轉儲,請先建立資料庫,然後再載入轉儲檔案時指定資料庫名稱
mysqldump 優點
- 允許所有資料庫、特定資料庫或特定表
- 允許備份本地伺服器或遠端伺服器
- 與儲存引擎無關
- 可移植性強
- 適用於小規模匯出,但不適用於完整備份解決方案
1.3、部分 mysqldump Options
所有Options詳見底部附錄或官網:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
Option Name | Description |
---|---|
–add-drop-database | 在每個 CREATE DATABASE 語句之前新增 DROP DATABASE 語句 |
–add-drop-table | 在每個 CREATE TABLE 語句之前新增 DROP TABLE 語句 |
–add-drop-trigger | 在每個 CREATE TRIGGER 語句之前新增 DROP TRIGGER 語句 |
–add-locks | 用 LOCK TABLES 和 UNLOCK TABLES 語句包圍每個錶轉儲 |
–all-databases | 轉儲所有資料庫中的所有表 |
–allow-keywords | 允許建立作為關鍵字的列名 |
二、mysqlbinlog
二進位制日誌包含描述資料庫更改(如表建立操作或表資料更改)的"事件",它有兩個重要用途:
- 對於複製,複製源伺服器上的二進位制日誌提供要傳送到副本的資料更改的記錄。源將二進位制日誌中包含的事件傳送到其副本,該副本執行這些事件以對源進行相同的資料更改。
- 某些資料恢復操作需要使用二進位制日誌。還原備份後,將重新執行備份後記錄的二進位制日誌中的事件。這些事件使資料庫從備份點更新。
2.1、使用二進位制日誌進行時間點恢復
時間點恢復的資訊來源是完整備份操作後生成的一組二進位制日誌檔案。若要啟用二進位制日誌,請使用--log-bin= base_name
選項啟動伺服器。如果未*base_name,
*則預設名稱是--pid 檔案
選項的值(預設情況下是主機的名稱):vi /etc/my.cnf
檢視所有的binlog檔名、大小和當前正在記錄日誌的binlog:
show binary logs;
show master status;
檢視日誌內容:
mysqlbinlog /var/lib/mysql/binlog.000001
匯出日誌:
mysqlbinlog -v /var/lib/mysql/binlog.000002 > /mnt/log.txt
可在匯出時對日誌進行限制:
–start-position 指定從哪開始匯出二進位制日誌
–stop-position 指定到哪結束
–start-datetime 從哪個時間開始,格式如"2021-01-27 11:25:56"
–stop-datetime 到哪個時間結束
將二進位制日誌檔案中的事件應用於伺服器
mysqlbinlog --start-position=1006 --stop-position=1868 /var/lib/mysql/binlog.000002
| mysql -u root -p
mysqld將數字副檔名追加到二進位制日誌基名,以生成二進位制日誌檔名稱。每次伺服器建立新日誌檔案時,該數字都會增加,從而建立一系列有序的檔案。每次發生以下任何事件時,伺服器都會在系列中建立一個新檔案:
- 伺服器已啟動或重新啟動
- 伺服器重新整理日誌。
--flush-logs
- 當前日誌檔案的大小達到
max_binlog_size
使用日誌恢復資料
做恢復增量備份前,需要恢復完全備份,再匯入增量備份
mysql -uroot -p < /mnt/log.txt
匯入增量備份
mysqlbinlog /var/lib/mysql/binlog.000002 | mysql -uroot -p
三、mysqlbackup
mysqlbackup是ORACLE公司提供的針對企業的備份軟體,全名叫做MySQL Enterprise Backup,是一個收費的軟體。官網:https://www.mysql.com/products/enterprise/backup.html
3.1、備份操作
基本語法,詳見https://dev.mysql.com/doc/mysql-enterprise-backup/4.1/en/backup-commands-backup.html
mysqlbackup [--backup-dir=PATH][--backup-image=IMAGE]
backup-to-image
mysqlbackup [--backup-dir=PATH][--backup-image=IMAGE]
backup | backup-and-apply-log
備份整個 MySQL 例項
./mysqlbackup --user=root --password --host=127.0.0.1
--backup-image=/home/admin/backups/my.mbi
--backup-dir=/home/admin/backup-tmp
backup-to-image
backup-to-image
生成儲存備份資料的單個檔案備份。在大多數情況下,單檔案備份優先於使用備份命令建立的目錄備份。該命令需要--backup-image
選項來指定目標檔案。可用於將備份流式傳輸到儲存裝置或其他系統,而無需將資料儲存在資料庫伺服器上。您可以指定--backup-image=
-表示標準輸出,允許將輸出管道處理到另一個命令。為了避免將正常資訊性訊息與備份輸出混合,訊息、錯誤、警報和正常資訊訊息始終列印到標準錯誤流中。
該命令還要求使用--backup-dir
選項提供臨時資料夾來儲存備份元資料和一些臨時輸出。但是請注意,除非使用--backup-image
流式傳輸備份映像,如果--backup-image
未提供完整路徑名稱, mysqlbackup實際上將 --backup-image
的值作為相對於--backup-dir
指定的目錄的路徑,從而將單檔案備份儲存在--backup-dir
目錄下。
backup
將資料備份到目錄。在大多數情況下,使用備份到映像命令建立的單檔案備份比目錄備份更可取。
該命令僅執行完整備份過程的初始階段。第二階段稍後通過使用apply-log
命令再次執行mysqlbackup 來執行,該命令使備份保持一致。
backup-and-apply-log
備份和應用日誌的組合。它不能用於增量備份。
3.2、驗證操作
為了確保備份資料的完整性,MySQL 企業備份提供了一個驗證命令,用於在建立備份或傳輸到其他系統後,通過備份頁的校驗和值驗證備份。
mysqlbackup [STD-OPTIONS]
[--backup-dir=PATH][--backup-image=IMAGE]
validate
下面是用於驗證備份映像的示例命令:
mysqlbackup -uroot --backup-image=/logs/fullimage.mi validate
下面是用於驗證備份目錄的示例命令:
mysqlbackup -uroot --backup-dir=/logs/backupext validate
為了避免在損壞過嚴重的檔案上花費過多的時間和資源,mysqlbackup在找到二十多個損壞的頁面後停止驗證 .ibd 檔案,然後繼續訪問下一個檔案。在這種情況下,操作摘要不會給出損壞頁面的完整計數,而只顯示"至少 20 頁已損壞"。對於任何備份目錄,操作只能驗證 InnoDB 資料檔案(和檔案)。不能檢測到備份目錄中的其他檔案型別(例如,檔案損壞)的問題。
3.3、還原操作
還原操作將資料檔案從備份還原到資料庫伺服器上的原始位置,或還原到其他所需位置。通常,還原過程要求資料庫伺服器已關閉(或者,至少不在還原資料的目錄上操作)。
必須在目標伺服器的配置檔案中、在--defaults file
選項指定的檔案中或作為命令列選項指定選項datadir
、innodb_log_files_in_group
和innodb_log_file_size
。
mysqlbackup [--backup-image=IMAGE]
[--backup-dir=PATH]
[--uncompress]
copy-back-and-apply-log
mysqlbackup [STD-OPTIONS]
[SERVER-REPOSITORY-OPTIONS]
[--backup-dir=PATH]
[--uncompress]
copy-back
恢復資料庫
./mysqlbackup --defaults-file=/etc/mysql/my.cnf --datadir=/var/lib/mysql
--backup-image=/home/admin/backups/my.mbi --backup-dir=/home/admin/restore-tmp copy-back-and-apply-log
–datadir 提供用於還原資料的資料目錄的位置。您必須為任何還原操作指定此選項。
–backup-image 提供單檔案備份的路徑。
–backup-dir 提供空資料夾的位置,以儲存還原過程中建立的所有臨時檔案。
copy-back-and-apply-log
在單個步驟中,將由 --backup-image
選項指定的單檔案備份或從 --backup-dir
選項指定的目錄備份還原到伺服器的資料目錄,並執行對還原的資料執行應用日誌操作,以使它們保持最新。與恢復單檔案備份的多步驟方法(通常包括執行提取、解壓縮、應用日誌和複製回的連續步驟以還原壓縮映像,或提取、應用日誌和複製回恢復未壓縮映像)相比,該命令使還原過程更簡單、更快,還可以節省所需的磁碟空間。
以下是使用copy-back-and-apply-log進行不同型別的備份還原的一些特殊要求:
- 若要還原壓縮目錄或映像,請在命令列中包括–uncompress 選項。
- 若要還原單檔案備份,除了使用–backup-image 選項指定備份映像的位置外,還要使用 --backup-dir選項提供用於儲存還原過程中生成的臨時檔案的資料夾的位置。
- 若要還原單個檔案增量備份,假設已還原完整備份(增量備份基於此備份):
- 在命令列中包括
--incremental
選項。 - 使用
--backup-image
選項指定增量備份映像的位置 - 使用
--backup-dir
選項提供用於儲存還原過程中生成的臨時檔案的資料夾的位置。
- 在命令列中包括
- 若要還原增量備份目錄,假設已還原完整備份(增量備份基於此備份):
在命令列中包括--incremental
選項。
使用--backup-dir
或--incremental-backup-dir
選項指定增量備份目錄。
copy-back
將檔案從目錄備份還原到 MySQL 伺服器中的原始位置。
3.4、其他單檔案備份操作
除了用於建立和還原單檔案備份的命令(即備份到映像和複製備份和應用程式日誌)之外,mysqlbackup還提供許多其他命令供您使用單檔案備份。
image-to-backup-dir
將單個檔案備份解壓縮到完整備份目錄結構。您可以指定解包的影象檔案和目標目錄的路徑。
backup-dir-to-image
將現有備份目錄打包到單個檔案中。引數的值應為"-"(代表標準輸出)或目錄外的絕對路徑。 指定--backup-image
值(標準輸出),將現有備份目錄結構流式傳輸到磁帶裝置或將備份轉移到其他伺服器的命令。
list-image
顯示單個檔案備份的內容。列出影象中的所有檔案和目錄。
mysqlbackup --backup-image=/home/admin/backups/my.mbi [list-image][extract]
extract
從單個檔案備份中解包單個檔案或目錄。它可用於故障排除或不需要完整備份資料的恢復。生成的檔案或目錄進入當前目錄,或進入備份目錄,如果使用--backup-dir
指定;在這兩種情況下,目標目錄都必須為空。
附錄
全部 mysqldump Options
Option Name | Description |
---|---|
–add-drop-database | 在每個 CREATE DATABASE 語句之前新增 DROP DATABASE 語句 |
–add-drop-table | 在每個 CREATE TABLE 語句之前新增 DROP TABLE 語句 |
–add-drop-trigger | 在每個 CREATE TRIGGER 語句之前新增 DROP TRIGGER 語句 |
–add-locks | 用 LOCK TABLES 和 UNLOCK TABLES 語句包圍每個錶轉儲 |
–all-databases | 轉儲所有資料庫中的所有表 |
–allow-keywords | 允許建立作為關鍵字的列名 |
–apply-slave-statements | 包括在 CHANGE MASTER 語句之前 STOP SLAVE ,在輸出結束時 START SLAVE |
–bind-address | 使用指定的網路介面連線到 MySQL 伺服器 |
–character-sets-dir | 安裝字符集的目錄 |
–comments | 向轉儲檔案添加註釋 |
–compact | 產生更緊湊的輸出 |
–compatible | 生成與其他資料庫系統或舊 MySQL 伺服器更相容的輸出 |
–complete-insert | 使用包含列名的完整 INSERT 語句 |
–compress | 壓縮客戶端和伺服器之間傳送的所有資訊 |
–create-options | 在 CREATE table 語句中包含所有特定於 mysql 的表選項 |
–databases | 將所有名稱引數解釋為資料庫名稱 |
–debug | 編寫除錯日誌 |
–debug-check | 程式退出時列印除錯資訊 |
–debug-info | 當程式退出時,列印除錯資訊、記憶體和 CPU 統計資訊 |
–default-auth | 要使用的驗證外掛 |
–default-character-set | 指定預設字符集 |
–defaults-extra-file | 除了通常的選項檔案外,還要讀取指定的選項檔案 |
–defaults-file | 只讀指定的選項檔案 |
–defaults-group-suffix | 選項組字尾值 |
–delayed-insert | 編寫插入延遲語句而不是插入語句 |
–delete-master-logs | 在主複製伺服器上,執行轉儲操作後刪除二進位制日誌 |
–disable-keys | 對於每個表,用語句包圍 INSERT 語句來禁用和啟用鍵 |
–dump-date | 如果給出了註釋,則將轉儲日期包含為 “dump completed on” 註釋 |
–dump-slave | 包含 CHANGE MASTER 語句,該語句列出 master 的二進位制日誌座標 |
–enable-cleartext-plugin | 啟用 cleartext 身份驗證外掛 |
–events | 從轉儲資料庫中轉儲事件 |
–extended-insert | 使用多行 INSERT 語法 |
–fields-enclosed-by | 此選項與 --tab 選項一起使用,其含義與 LOAD DATA 的對應子句相同 |
–fields-escaped-by | 此選項與 --tab 選項一起使用,其含義與 LOAD DATA 的對應子句相同 |
–fields-optionally-enclosed-by | 此選項與 --tab 選項一起使用,其含義與 LOAD DATA 的對應子句相同 |
–fields-terminated-by | 此選項與 --tab 選項一起使用,其含義與 LOAD DATA 的對應子句相同 |
–flush-logs | 在開始轉儲之前重新整理 MySQL 伺服器日誌檔案 |
–flush-privileges | 在轉儲 mysql 資料庫之後發出一個 FLUSH PRIVILEGES 語句 |
–force | 即使在錶轉儲期間發生 SQL 錯誤,也要繼續 |
–help | 顯示幫助資訊並退出 |
–hex-blob | 使用十六進位制表示法轉儲二進位制列 |
–host | 要連線到的主機 (IP 地址或主機名 ) |
–ignore-table | 不轉儲指定的表 |
–include-master-host-port | 在使用 --dump-slave 生成的 CHANGE MASTER 語句中包含 MASTER_HOST/MASTER_PORT 選項 |
–insert-ignore | 編寫 INSERT IGNORE 而不是 INSERT 語句 |
–lines-terminated-by | 此選項與 --tab 選項一起使用,其含義與 LOAD DATA 的對應子句相同 |
–lock-all-tables | 跨所有資料庫鎖定所有表 |
–lock-tables | 轉儲前鎖表 |
–log-error | 在命名檔案中新增警告和錯誤 |
–login-path | 從 .mylogin.cnf 中讀取登入路徑選項 |
–master-data | 將二進位制日誌檔名和位置寫入輸出 |
–max-allowed-packet | 從伺服器傳送或接收的最大資料包長度 |
–net-buffer-length | TCP/IP 和套接字通訊的緩衝區大小 |
–no-autocommit | 將每個轉儲表的 INSERT 語句封裝在 SET autocommit = 0 和 COMMIT 語句中 |
–no-create-db | 不寫 CREATE DATABASE 語句 |
–no-create-info | 不寫重新建立每個轉儲的表的 CREATE TABLE 語句 |
–no-data | 不轉儲表內容 |
–no-defaults | 不讀取 default 選項檔案 |
–no-set-names | –skip-set-charset 一樣 |
–no-tablespaces | 不寫任何 CREATE LOGFILE GROUP or CREATE TABLESPACE 語句 |
–opt | –add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 的簡寫 |
–order-by-primary | 轉儲按其主鍵或第一個惟一索引排序的每個表的行 |
–password | 連線到伺服器時使用的密碼 |
–pipe | 在 Windows 上,使用命名管道連線到伺服器 |
–plugin-dir | 安裝外掛的目錄 |
–port | 用於連線的 TCP/IP 埠號 |
–print-defaults | 列印預設選項 |
–protocol | 使用的連線協議 |
–quick | 每次從伺服器中逐行檢索表的行 |
–quote-names | 反勾字元中的引號識別符號 |
–replace | 編寫 REPLACE 語句而不是 INSERT 語句 |
–result-file | 直接輸出到給定的檔案 |
–routines | 從轉儲資料庫中轉儲儲存的例程 ( 過程和函式 ) |
–secure-auth | 不傳送舊 (4.1 前 ) 格式的密碼到伺服器 , 5.7.5 棄用 |
–set-charset | 將集合名 default_character_set 新增到輸出 |
–set-gtid-purged | 是否新增 SET @@GLOBAL.GTID_PURGED 輸出 |
–shared-memory-base-name | 用於 shared-memory 連線的共享記憶體的名稱 |
–single-transaction | 在從伺服器轉儲資料之前發出 BEGIN SQL 語句 |
–skip-add-drop-table | 不要在每個 CREATE TABLE 語句之前新增 DROP TABLE 語句 |
–skip-add-locks | 不要新增鎖 |
–skip-comments | 不向轉儲檔案添加註釋 |
–skip-compact | 不生產更緊湊的輸出 |
–skip-disable-keys | 不要禁用鍵 |
–skip-extended-insert | 關掉 extended-insert |
–skip-opt | 關閉由 --opt 設定的選項 |
–skip-quick | 不從伺服器一次一行檢索表的行 |
–skip-quote-names | 不要引用識別符號 |
–skip-set-charset | 不寫 SET NAMES 語句 |
–skip-triggers | 不要轉儲觸發器 |
–skip-tz-utc | 關掉 tz-utc |
–socket | 要連線到本地主機,請使用 Unix 套接字檔案 |
–ssl | 啟用加密連線 |
–ssl-ca | 包含受信任 SSL 證書頒發機構列表的檔案 |
–ssl-capath | 包含可信 SSL 證書頒發機構證書檔案的目錄 |
–ssl-cert | 包含 X.509 證書的檔案 |
–ssl-cipher | 連線加密的允許密碼列表 |
–ssl-crl | 包含證書撤銷列表的檔案 |
–ssl-crlpath | 包含證書撤銷列表檔案的目錄 |
–ssl-key | 包含 X.509 鍵的檔案 |
–ssl-mode | 連線到伺服器的安全狀態 |
–ssl-verify-server-cert | 根據伺服器證書公共名稱標識驗證主機名 |
–tab | 生成製表符分隔的資料檔案 |
–tables | 覆蓋 --databases 或 -B 選項 |
–triggers | 每個轉儲表的轉儲觸發器 |
–tz-utc | 將 SET TIME_ZONE=’+00:00’ 新增到轉儲檔案 |
–user | 連線到伺服器時使用的 MySQL 使用者名稱 |
–verbose | 詳細模式 |
–version | 顯示版本資訊並退出 |
–where | 只轉儲由給定 WHERE 條件選擇的行 |
–verbose | 詳細模式 |
–version | 顯示版本資訊並退出 |
–where | 只轉儲由給定 WHERE 條件選擇的行 |
–xml | 生成 XML 輸出 |