備份是資料安全的最後一道防線,對於任何資料丟失的場景,備份雖然不一定能恢復百分之百的資料(取決於備份週期),但至少能將損失降到最低。
資料丟失的場景舉例:
衡量備份恢復有兩個重要的指標:
資料庫備份方式分很多種,從物理與邏輯的角度來看,備份可分為:
資料庫的備份從策略角度來看,備份可分為以下幾類:
MySQL官方提供了Mysqldump邏輯備份工具,它的備份原理是通過協定連線到 MySQL 資料庫,將需要備份的資料查詢出來,將查詢出的資料轉換成對應的insert語句,當我們需要還原這些資料時,只要執行這些insert語句,即可將對應的資料還原。
# mysqldump命令語法:
mysqldump [選項] 資料庫名 [表名] > 備份檔名
# 資料恢復
mysql [選項] 資料庫名 [表名] > 備份檔名
source 備份檔名
選項列表:
選項名 | 含義 |
---|---|
--host | 伺服器IP地址 |
--port | 伺服器埠號 |
--user | MySQL 使用者名稱 |
--password | MySQL 密碼 |
--databases | 指定要備份的資料庫 |
--all-databases | 備份mysql伺服器上的所有資料庫 |
--compact | 壓縮模式,產生更少的輸出 |
--comments | 新增註釋資訊 |
--complete-insert | 輸出完成的插入語句 |
--lock-tables | 備份前,鎖定所有資料庫表 |
–no-create-db / --no-create-info | 禁止生成建立資料庫語句 |
--force | 當出現錯誤時仍然繼續備份操作 |
--default-character-set | 指定預設字元集 |
--add-locks | 備份資料庫表時鎖定資料庫表 |
XtraBackup(PXB)工具是Percona公司用perl語言開發的一個用於 MySQL資料庫物理熱備的備份工具,能夠非常快速地備份與恢復mysql資料庫,且支援線上熱備份(備份時不影響資料讀寫)。
Xtrabackup中包含兩個工具:
Xtrabackup的優點:
# 語法:
xtrabackup | innobackupex [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]
Xtrabackup工具備份常用選項:
選項類別 | 命令全名 | 含義 |
---|---|---|
通用選項 | --user=name | 資料庫賬號名 |
通用選項 | --password | 資料庫密碼 |
通用選項 | --host=name | 資料庫主機IP地址 |
通用選項 | --port=name | 資料庫主機埠號 |
通用選項 | --defaults-file | 定義包含預設設定的檔案的路徑。 |
通用選項 | --socket=name | 資料庫socket檔案地址 |
備份選項 | --backup | 建立備份並且放入--target-dir目錄中 |
備份選項 | --target-dir | 備份檔案的存放目錄路徑,如果目錄不存在,xtrabakcup會建立。如果目錄存在且為空則成功。不會覆蓋已存在的檔案。 |
備份選項 | --databases=name | 指定要備份的資料庫 |
增量選項 | --incremental-basedir | 使用增量備份 |
壓縮/解壓選項 | --compress | compress壓縮 |
壓縮/解壓選項 | --compress-threads=n | 啟用n個執行緒進行壓縮 |
壓縮/解壓選項 | --decompress | 準備資料之前先解壓 |
準備選項 | --prepare | 實現同步回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態 |
準備選項 | --apply-log-only | 阻止回滾未提完成的事務(最後一次增量備份的準備不需要此選項) |
準備選項 | --incremental-dir | 指定增量備份,與全備合併 |
還原選項 | --copy-back | 做資料恢復時將備份資料檔案拷貝到MySQL伺服器的datadir。 |
還原選項 | --move-back | 這個選項與–copy-back相似,唯一的區別是它不拷貝檔案,而是移動檔案到目的地。這個選項會移除backup檔案,用時候必須小心。 |
# 下載安裝Xtrabackup備份工具
[root@localhost ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.22-15/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.22-15.1.el8.x86_64.rpm
[root@localhost ~]#dnf -y localinstall percona-xtrabackup-80-8.0.22-15.1.el8.x86_64.rpm
# 完全備份
[root@localhost ~]#trabackup --backup --databases=zsl --target-dir=/backup/xtrabackup/ -uroot -pPasswd123!
# 恢復階段:準備備份,恢復之前需要準備備份
[root@localhost ~]#xtrabackup --prepare --target-dir=/backup/xtrabackup/
# 恢復資料(保證要還原的資料庫伺服器的data目錄為空)
[root@localhost ~]#rm -rf /var/lib/mysql/* #模擬資料丟失
[root@localhost ~]#xtrabackup --copy-back --target-dir=/backup/xtrabackup/
[root@localhost ~]#chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]#systemctl restart mysqld
增量備份:
# 先建立完全備份
[root@localhost ~]#xtrabackup --backup --databases=test --target-dir=/backup/xtrabackup/ -uroot -p123456
# 建立第一次增量備份
[root@localhost ~]#xtrabackup --backup --databases=test --target-dir=/backup/inc1/ --incremental-basedir=/backup/xtrabackup/ -uroot -p123456
# 建立第二次增量備份
[root@localhost ~]#xtrabackup --backup --databases=test --target-dir=/backup/inc2/ --incremental-basedir=/backup/inc1/ -uroot -p123456
# 恢復階段:準備全量備份
[root@localhost ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup/
# 準備第一次增量備份,將第一次增量備份與全備合併
[root@localhost ~]#xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup/ --incremental-dir=/backup/inc1
# 準備第二次增量備份,將第二次增量備份與全備合併
[root@localhost ~]#xtrabackup --prepare --target-dir=/backup/xtrabackup/ --incremental-dir=/backup/inc2/
# 恢復資料(保證要還原的資料庫伺服器的data目錄為空)
[root@localhost ~]#rm -rf /var/lib/mysql/* # 模擬資料丟失
[root@localhost ~]#xtrabackup --copy-back --target-dir=/backup/xtrabackup/
[root@localhost ~]#chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]#systemctl restart mysqld
Mariabackup是MariaDB提供的一個開源工具,用於對InnoDB,Aria和MyISAM表進行物理線上備份。這個工具基於Percona的XtraBackup解決方案。
# 語法:
mariabackup [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]
# 常用選項
- -backup #備份資料庫
- -copy-back #將備份還原到資料目錄
- -defaults-file #定義包含預設設定的檔案的路徑
-H, --host #定義要備份的MariaDB伺服器的主機
- -incremental-basedir #定義是否要增加備份
- -incremental-dir #定義是否要增加準備好的備份
- -move-back #將備份還原到資料目錄
-p, --password #定義用於連線MariaDB Server的密碼
-P, --port #定義要連線的伺服器埠
- -prepare #準備現有備份以還原到MariaDB伺服器
-S, --socket #定義用於連線本地資料庫的通訊端
- -user #定義用於連線MariaDB伺服器的使用者名稱
- -version-check #啟用版本檢查
- -version #列印版本資訊
完全備份與恢復:
# 全量備份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F` --user root --password "1"
# 恢復階段:準備全備資料,恢復之前必須準備
mariabackup --prepare --target-dir /root/mariadb-backup-2022-07-28/ --user root --password "1"
# 恢復資料(保證要還原的資料庫伺服器的data目錄為空)
rm -rf /var/lib/mysql/* #模擬資料丟失
mariabackup --copy-back --target-dir /root/mariadb-backup-2022-07-28/ --user root --password "1"
chown -R mysql.mysql /var/lib/mysql/
systemctl restart mariadb.service
增量備份與恢復:
# 全量備份,增量備份前需要先進行一次全量備份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F` --user root --password "1"
# 基於全量備份,進行第一次增量備份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F`-inc1 --incremental-basedir /root/mariadb-backup-2022-07-28/ --user root --password "1"
# 恢復階段:現在有2個備份,一個是全備一個是增量備份
# 準備全備資料
mariabackup --prepare --apply-log-only --target-dir /root/mariadb-backup-2022-07-28/ --user root --password "1"
# 將增量備份與全備合併
mariabackup --prepare --target-dir /root/mariadb-backup-2022-07-28/ --incremental-dir /root/mariadb-backup-2022-07-28-inc1/ --user root --password "1"
# 如果有多次增量備份,按照增量備份順序依次將增量備份與全備合併,記得加--apply-log-only選項,最後一次增量備份不需要新增該選項
# 恢復資料(保證要還原的資料庫伺服器的data目錄為空)
rm -rf /var/lib/mysql/* #模擬資料丟失
mariabackup --copy-back --target-dir /root/mariadb-backup-2022-07-28/ --user root --password "1"
chown -R mysql.mysql /var/lib/mysql/
systemctl restart mariadb.service
# 備份整個資料庫(全備)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
5 rows in set (0.00 sec)
mysql> use zsl;
Database changed
mysql> show tables;
+---------------+
| Tables_in_zsl |
+---------------+
| course |
| students |
| teacher |
+---------------+
3 rows in set (0.00 sec)
[root@localhost ~]# mysqldump -uroot -pPasswd123! --all-databases > all-database-$(date '+%F-%H-%M-%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls
all-database-2022-07-29-10-45-04.sql anaconda-ks.cfg
# 備份zsl庫的course表、students表和teacher表
[root@localhost ~]# mysqldump -uroot -pPasswd123! zsl course students teacher > table-$(date '+%F-%H-%M-%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls
all-database-2022-07-29-10-45-04.sql anaconda-ks.cfg table-2022-07-29-10-45-27.sql
# 備份zsl庫
[root@localhost ~]# mysqldump -uroot -pPasswd123! --databases zsl > zsl-database-$(date '+%F-%H-%M-%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ls
all-database-2022-07-29-10-45-04.sql table-2022-07-29-10-45-27.sql
anaconda-ks.cfg zsl-database-2022-07-29-10-47-47.sql
# 模擬誤刪zsl資料庫
mysql> drop database zsl;
Query OK, 3 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
# 恢復zsl資料庫
##方法一:系統行命令資料恢復
[root@localhost ~]# mysql -uroot -pPasswd123! < zsl-database-2022-07-29-10-47-47.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
5 rows in set (0.00 sec)
方法二:source資料恢復
mysql> source zsl-database-2022-07-29-10-47-47.sql;
......
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
......
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
5 rows in set (0.00 sec)
# 模擬刪除zsl庫的course表、students表
mysql> drop table course;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table students;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_zsl |
+---------------+
| teacher |
+---------------+
1 row in set (0.00 sec)
# 恢復zsl庫的course表、students表
mysql> source table-2022-07-29-10-45-27.sql;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
......
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_zsl |
+---------------+
| course |
| students |
| teacher |
+---------------+
3 rows in set (0.00 sec)
# 模擬刪除整個資料庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
5 rows in set (0.00 sec)
mysql> drop database zsl;
Query OK, 3 rows affected (0.00 sec)
mysql> drop database sys;
Query OK, 101 rows affected (0.02 sec)
mysql> drop database mysql;
Query OK, 31 rows affected, 2 warnings (0.03 sec)
mysql> drop database performance_schema;
Query OK, 87 rows affected, 2 warnings (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)
# 恢復整個資料庫
[root@localhost ~]# mysql -uroot -pPasswd123! < all-database-2022-07-29-10-45-04.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| zsl |
+--------------------+
3 rows in set (0.00 sec)
開啟MySQL伺服器的二進位制紀錄檔功能
[root@localhost ~]# vim /etc/my.cnf
[root@localhost ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
server-id=1 #設定伺服器識別符號
log-bin=mysql_bin #開啟二進位制紀錄檔功能
[root@localhost ~]# service mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
對資料庫進行完全備份
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
5 rows in set (0.00 sec)
mysql> show tables from zsl;
+---------------+
| Tables_in_zsl |
+---------------+
| course |
| students |
| teacher |
+---------------+
3 rows in set (0.00 sec)
mysql> select * from zsl.course;
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | HTML |
| 2 | JAVA |
| 3 | MySQL |
| 4 | Python |
| 5 | C++ |
+----+-------------+
5 rows in set (0.01 sec)
mysql> select * from zsl.students;
+----+-------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+-------+------+------+--------+-----------+
| 1 | meng | 25 | 女 | 160 | 1 |
| 2 | ke | 22 | 男 | 180 | 3 |
| 3 | yang | 18 | 男 | 175 | 2 |
| 4 | ding | 19 | 女 | 165 | 4 |
| 5 | zhong | 20 | 男 | 165 | 5 |
+----+-------+------+------+--------+-----------+
5 rows in set (0.00 sec)
mysql> select * from zsl.teacher;
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | aa | 25 | 女 | 160 | 1 |
| 2 | bb | 22 | 男 | 180 | 3 |
| 3 | cc | 18 | 男 | 175 | 2 |
| 4 | dd | 19 | 女 | 165 | 4 |
| 5 | ee | 20 | 男 | 165 | 5 |
+----+------+------+------+--------+-----------+
5 rows in set (0.00 sec)
# 開始完全備份
[root@localhost ~]# mysqldump -uroot -pPasswd123! --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > all-database-$(date '+%F-%H-%M-%S').sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ll
total 1732
-rw-r--r--. 1 root root 878539 Jul 29 10:45 all-database-2022-07-29-10-45-04.sql
-rw-r--r--. 1 root root 878710 Jul 29 11:21 all-database-2022-07-29-11-21-10.sql
-rw-------. 1 root root 1097 Jul 21 18:41 anaconda-ks.cfg
-rw-r--r--. 1 root root 3726 Jul 29 10:45 table-2022-07-29-10-45-27.sql
-rw-r--r--. 1 root root 3862 Jul 29 10:47 zsl-database-2022-07-29-10-47-47.sql
# 新增或刪減內容
mysql> select * from course;
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | HTML |
| 2 | JAVA |
| 3 | MySQL |
| 5 | C++ |
| 6 | wuli |
| 7 | huaxue |
| 8 | shuxue |
| 9 | yuwen |
+----+-------------+
8 rows in set (0.00 sec)
mysql> select * from students;
+----+-------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+-------+------+------+--------+-----------+
| 1 | meng | 25 | 女 | 160 | 1 |
| 2 | ke | 22 | 男 | 180 | 3 |
| 3 | yang | 18 | 男 | 175 | 2 |
| 4 | ding | 19 | 女 | 165 | 4 |
| 5 | zhong | 20 | 男 | 165 | 5 |
+----+-------+------+------+--------+-----------+
5 rows in set (0.00 sec)
mysql> select * from teacher;
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | aa | 25 | 女 | 160 | 1 |
| 2 | bb | 22 | 男 | 180 | 3 |
| 3 | cc | 18 | 男 | 175 | 2 |
| 4 | dd | 19 | 女 | 165 | 4 |
| 5 | ee | 20 | 男 | 165 | 5 |
| 6 | qq | 20 | 男 | 156 | 2 |
| 7 | gg | 60 | 男 | 186 | 3 |
| 8 | ff | 20 | 女 | 185 | 2 |
| 9 | rr | 15 | 男 | 189 | 9 |
+----+------+------+------+--------+-----------+
9 rows in set (0.00 sec)
# 模擬誤刪資料
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'drop database zsl;'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
# 由上可以看到zsl這個資料庫已被刪除
# 重新整理建立新的二進位制紀錄檔
[root@localhost ~]# ll /opt/data/
total 122984
-rw-r-----. 1 mysql mysql 56 Jul 29 02:43 auto.cnf
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 client-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 client-key.pem
-rw-r-----. 1 mysql mysql 669 Jul 29 11:12 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Jul 29 11:39 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Jul 29 11:39 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Jul 29 02:43 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Jul 29 11:21 ibtmp1
-rw-r-----. 1 mysql mysql 20346 Jul 29 11:12 localhost.localdomain.err
drwxr-x---. 2 mysql mysql 4096 Jul 29 11:10 mysql
-rw-r-----. 1 mysql mysql 3913 Jul 29 11:39 mysql_bin.000003
-rw-r-----. 1 mysql mysql 19 Jul 29 11:21 mysql_bin.index
-rw-r-----. 1 mysql mysql 5 Jul 29 11:12 mysql.pid
-rw-r--r--. 1 root root 6 Jul 29 11:10 mysql_upgrade_info
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 performance_schema
-rw-------. 1 mysql mysql 1676 Jul 29 02:43 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Jul 29 02:43 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 server-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 server-key.pem
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 sys
[root@localhost ~]# mysqladmin -uroot -pPasswd123! flush-logs
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# ll /opt/data/
total 122988
-rw-r-----. 1 mysql mysql 56 Jul 29 02:43 auto.cnf
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 client-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 client-key.pem
-rw-r-----. 1 mysql mysql 669 Jul 29 11:12 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Jul 29 11:41 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Jul 29 11:41 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Jul 29 02:43 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Jul 29 11:21 ibtmp1
-rw-r-----. 1 mysql mysql 20346 Jul 29 11:12 localhost.localdomain.err
drwxr-x---. 2 mysql mysql 4096 Jul 29 11:10 mysql
-rw-r-----. 1 mysql mysql 3960 Jul 29 11:41 mysql_bin.000003
-rw-r-----. 1 mysql mysql 154 Jul 29 11:41 mysql_bin.000004
-rw-r-----. 1 mysql mysql 38 Jul 29 11:41 mysql_bin.index
-rw-r-----. 1 mysql mysql 5 Jul 29 11:12 mysql.pid
-rw-r--r--. 1 root root 6 Jul 29 11:10 mysql_upgrade_info
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 performance_schema
-rw-------. 1 mysql mysql 1676 Jul 29 02:43 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Jul 29 02:43 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 server-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 server-key.pem
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 sys
# 恢復完全備份
[root@localhost ~]# mysql -uroot -pPasswd123! < all-database-2022-07-29-11-21-10.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| zsl |
+--------------------+
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'show tables from zsl;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+
| Tables_in_zsl |
+---------------+
| course |
| students |
| teacher |
+---------------+
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'select * from zsl.course;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | HTML |
| 2 | JAVA |
| 3 | MySQL |
| 4 | Python |
| 5 | C++ |
+----+-------------+
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'select * from zsl.students;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+-------+------+------+--------+-----------+
| 1 | meng | 25 | 女 | 160 | 1 |
| 2 | ke | 22 | 男 | 180 | 3 |
| 3 | yang | 18 | 男 | 175 | 2 |
| 4 | ding | 19 | 女 | 165 | 4 |
| 5 | zhong | 20 | 男 | 165 | 5 |
+----+-------+------+------+--------+-----------+
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'select * from zsl.teacher;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | aa | 25 | 女 | 160 | 1 |
| 2 | bb | 22 | 男 | 180 | 3 |
| 3 | cc | 18 | 男 | 175 | 2 |
| 4 | dd | 19 | 女 | 165 | 4 |
| 5 | ee | 20 | 男 | 165 | 5 |
+----+------+------+------+--------+-----------+
# 恢復差異備份
[root@localhost ~]# ll /opt/data/
total 189544
-rw-r-----. 1 mysql mysql 56 Jul 29 02:43 auto.cnf
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 ca.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 client-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 client-key.pem
-rw-r-----. 1 mysql mysql 669 Jul 29 11:12 ib_buffer_pool
-rw-r-----. 1 mysql mysql 79691776 Jul 29 11:47 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Jul 29 11:47 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Jul 29 02:43 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Jul 29 11:21 ibtmp1
-rw-r-----. 1 mysql mysql 20346 Jul 29 11:12 localhost.localdomain.err
drwxr-x---. 2 mysql mysql 4096 Jul 29 11:45 mysql
-rw-r-----. 1 mysql mysql 3960 Jul 29 11:41 mysql_bin.000003
-rw-r-----. 1 mysql mysql 859354 Jul 29 11:45 mysql_bin.000004
-rw-r-----. 1 mysql mysql 38 Jul 29 11:41 mysql_bin.index
-rw-r-----. 1 mysql mysql 5 Jul 29 11:12 mysql.pid
-rw-r--r--. 1 root root 6 Jul 29 11:10 mysql_upgrade_info
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 performance_schema
-rw-------. 1 mysql mysql 1676 Jul 29 02:43 private_key.pem
-rw-r--r--. 1 mysql mysql 452 Jul 29 02:43 public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Jul 29 02:43 server-cert.pem
-rw-------. 1 mysql mysql 1680 Jul 29 02:43 server-key.pem
drwxr-x---. 2 mysql mysql 8192 Jul 29 11:10 sys
drwxr-x---. 2 mysql mysql 134 Jul 29 11:45 zsl
# 檢查誤刪資料庫的位置在什麼地方
mysql> show binlog events in 'mysql_bin.000003';
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| mysql_bin.000003 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.37-log, Binlog ver: 4 |
| mysql_bin.000003 | 123 | Previous_gtids | 1 | 154 | |
| mysql_bin.000003 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 219 | Query | 1 | 290 | BEGIN |
| mysql_bin.000003 | 290 | Table_map | 1 | 349 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 349 | Write_rows | 1 | 510 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 510 | Xid | 1 | 541 | COMMIT /* xid=988 */ |
| mysql_bin.000003 | 541 | Anonymous_Gtid | 1 | 606 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 606 | Query | 1 | 677 | BEGIN |
| mysql_bin.000003 | 677 | Table_map | 1 | 728 | table_id: 178 (zsl.course) |
| mysql_bin.000003 | 728 | Write_rows | 1 | 808 | table_id: 178 flags: STMT_END_F |
| mysql_bin.000003 | 808 | Xid | 1 | 839 | COMMIT /* xid=989 */ |
| mysql_bin.000003 | 839 | Anonymous_Gtid | 1 | 904 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 904 | Query | 1 | 975 | BEGIN |
| mysql_bin.000003 | 975 | Table_map | 1 | 1034 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 1034 | Write_rows | 1 | 1201 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 1201 | Xid | 1 | 1232 | COMMIT /* xid=990 */ |
| mysql_bin.000003 | 1232 | Anonymous_Gtid | 1 | 1297 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 1297 | Query | 1 | 1368 | BEGIN |
| mysql_bin.000003 | 1368 | Table_map | 1 | 1427 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 1427 | Delete_rows | 1 | 1483 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 1483 | Xid | 1 | 1514 | COMMIT /* xid=994 */ |
| mysql_bin.000003 | 1514 | Anonymous_Gtid | 1 | 1579 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 1579 | Query | 1 | 1650 | BEGIN |
| mysql_bin.000003 | 1650 | Table_map | 1 | 1709 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 1709 | Delete_rows | 1 | 1765 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 1765 | Xid | 1 | 1796 | COMMIT /* xid=995 */ |
| mysql_bin.000003 | 1796 | Anonymous_Gtid | 1 | 1861 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 1861 | Query | 1 | 1932 | BEGIN |
| mysql_bin.000003 | 1932 | Table_map | 1 | 1991 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 1991 | Delete_rows | 1 | 2048 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 2048 | Xid | 1 | 2079 | COMMIT /* xid=996 */ |
| mysql_bin.000003 | 2079 | Anonymous_Gtid | 1 | 2144 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 2144 | Query | 1 | 2215 | BEGIN |
| mysql_bin.000003 | 2215 | Table_map | 1 | 2274 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 2274 | Delete_rows | 1 | 2331 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 2331 | Xid | 1 | 2362 | COMMIT /* xid=997 */ |
| mysql_bin.000003 | 2362 | Anonymous_Gtid | 1 | 2427 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 2427 | Query | 1 | 2498 | BEGIN |
| mysql_bin.000003 | 2498 | Table_map | 1 | 2557 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 2557 | Delete_rows | 1 | 2614 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 2614 | Xid | 1 | 2645 | COMMIT /* xid=998 */ |
| mysql_bin.000003 | 2645 | Anonymous_Gtid | 1 | 2710 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 2710 | Query | 1 | 2781 | BEGIN |
| mysql_bin.000003 | 2781 | Table_map | 1 | 2840 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 2840 | Delete_rows | 1 | 2897 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 2897 | Xid | 1 | 2928 | COMMIT /* xid=999 */ |
| mysql_bin.000003 | 2928 | Anonymous_Gtid | 1 | 2993 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 2993 | Query | 1 | 3064 | BEGIN |
| mysql_bin.000003 | 3064 | Table_map | 1 | 3123 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 3123 | Delete_rows | 1 | 3180 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 3180 | Xid | 1 | 3211 | COMMIT /* xid=1000 */ |
| mysql_bin.000003 | 3211 | Anonymous_Gtid | 1 | 3276 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 3276 | Query | 1 | 3347 | BEGIN |
| mysql_bin.000003 | 3347 | Table_map | 1 | 3406 | table_id: 180 (zsl.teacher) |
| mysql_bin.000003 | 3406 | Delete_rows | 1 | 3463 | table_id: 180 flags: STMT_END_F |
| mysql_bin.000003 | 3463 | Xid | 1 | 3494 | COMMIT /* xid=1001 */ |
| mysql_bin.000003 | 3494 | Anonymous_Gtid | 1 | 3559 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 3559 | Query | 1 | 3630 | BEGIN |
| mysql_bin.000003 | 3630 | Table_map | 1 | 3681 | table_id: 178 (zsl.course) |
| mysql_bin.000003 | 3681 | Delete_rows | 1 | 3728 | table_id: 178 flags: STMT_END_F |
| mysql_bin.000003 | 3728 | Xid | 1 | 3759 | COMMIT /* xid=1002 */ |
| mysql_bin.000003 | 3759 | Anonymous_Gtid | 1 | 3824 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql_bin.000003 | 3824 | Query | 1 | 3913 | drop database zsl |
| mysql_bin.000003 | 3913 | Rotate | 1 | 3960 | mysql_bin.000004;pos=4 |
+------------------+------+----------------+-----------+-------------+---------------------------------------+
65 rows in set (0.00 sec)
# 使用mysqlbinlog恢復差異備份
[root@localhost ~]# mysqlbinlog --stop-position=3824 /opt/data/mysql_bin.000003 |mysql -uroot -pPasswd123!
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# mysql -uroot -pPasswd123! -e 'select * from zsl.course;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+-------------+
| id | course_name |
+----+-------------+
| 1 | HTML |
| 2 | JAVA |
| 3 | MySQL |
| 5 | C++ |
| 6 | wuli |
| 7 | huaxue |
| 8 | shuxue |
| 9 | yuwen |
+----+-------------+
擴充套件
- 二進位制紀錄檔轉換文字檔案
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000003 > /opt/mysql_bin003.txt
- 根據時間點恢復資料
mysqlbinlog --no-defaults --stop-datetime='2022-07-29 12:06:12' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p //基於時間恢復 從開頭到指定的時間停止 之前的都會執行操作
mysqlbinlog --no-defaults --start-datetime='2022-07-29 12:06:16' /usr/local/mysql/data/mysql-bin.000002 | mysql -u root -p //基於正確的時間恢復 從指定的時間點到結尾都會執行操作