數據庫備份類型:
· 冷備份:在數據庫關閉狀態下進行備份操作
· 熱備份:在數據庫處于運行狀態時進行備份操作
· 溫備份:數據庫鎖定表格(不可寫入但可讀取)的狀態下進行備份操作
數據庫完全備份操作
1. 物理冷備份與恢復 使用tar命令
1)備份數據庫
[root@localhost /]# systemctl stop MySQLd
[root@localhost /]# mkdir /backup
[root@localhost /]# tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/
tar: 從成員名中刪除開頭的"/"
· /usr/local/mysql/data/:mysql的數據庫文件夾
[root@localhost /]# ls -l /backup/
總用量 724
-rw-r--r--. 1 root root 741318 8月 10 08:29 mysql_all-2020-08-10.tar.gz
2) 恢復數據庫
執行以下操作將數據庫文件夾移除到bak目錄,模擬丟失文件故障
[root@localhost /]# mkdir /bak
[root@localhost /]# mv /usr/local/mysql/data/ /bak/
執行以下操作從備份文件恢復數據
[root@localhost /]# mkdir /restore
[root@localhost /]# tar zxf /backup/mysql_all-2020-08-10.tar.gz -C /restore/
[root@localhost /]# mv /restore/usr/local/mysql/data/ /usr/local/mysql/
[root@localhost /]# systemctl start mysqld
[root@localhost /]# netstat -anput |grep 3306
tcp6 0 0 :::3306 :::* LISTEN 3970/mysqld
2. mysqldump備份與恢復
通過此命令可以將指定的庫,表或全部的庫導出為SQL腳本,便于該命令在不同版本的MySQL服務器上使用。例如,當需要升級mysql服務器時,可以先使用mysqldump命令將原有庫信息導出,然后直接在升級后的MySQL服務器導入即可。
[root@localhost /]# mysqladmin -u root -p password '123456'
1) 備份數據庫
格式一:將mysql庫中的user表導出為mysql-user.sql
[root@localhost /]# mysqldump -u root -p mysql user > mysql-user.sql
Enter password: 輸入密碼
格式二:將整個test庫導出為test.sql尾巴文件,所有操作均以root用戶身份驗證
[root@localhost /]# mysqldump -u root -p --databases test > test.sql
Enter password:
格式三:備份導出整個MySQL服務器中的庫。使用—opt優化執行速度
[root@localhost /]# mysqldump -u root -p --opt --all-databases > all-data.sql
Enter password:
2) 查看備份文件
[root@localhost /]# grep -v "^–" 備份完成的名稱
3) 恢復數據庫
使用sqldump命令導出的SQL備份腳本,在恢復時通過mysql命令對其進行導入操作。
格式:mysql 【選項】【庫名】【表名】< /備份路徑/備份文件名
模擬故障:刪除上述三個備份的原文件,使用dump導入恢復。
mysql> drop table user;
Query OK, 0 rows affected (0.00 sec)
[root@localhost /]# mysql -u root -p mysql < /mysql-user.sql
Enter password:
備份的文件
數據庫
查詢是否恢復
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+ |
………
| user |
+---------------------------+
28 rows in set (0.00 sec)
模擬故障:刪除test數據庫,再導入恢復。
mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)
導入備份數據恢復
3. MySQL的增量備份與恢復(重點)
增量備份沒有重要數據,備份量不大,時間短;但恢復及其麻煩,需要上次完全備份+之后所有的增量備份才能恢復,需要對所有增量備份進行逐個反推恢復。Mysql沒有提供直接的增量備份辦法,可以通過mysql提供的二進制日志間接實現增量備份。
Mysql的增量備份需要開啟二進制功能。
[root@localhost /]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin 添加
[root@localhost /]# systemctl restart mysqld
[root@localhost /]# ls -l /usr/local/mysql/mysql-bin.*
-rw-rw----. 1 mysql mysql 120 8月 10 09:43 /usr/local/mysql/mysql-bin.000001
-rw-rw----. 1 mysql mysql 34 8月 10 09:43 /usr/local/mysql/mysql-bin.index
MySQL企業備份案例
1、 一般恢復
1) 添加數據庫、表、錄入信息
mysql> create database local;
mysql> use local;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(2);
Query OK, 1 row affected (0.01 sec)
2) 先進行一次完全備份
[root@localhost ~]# mkdir /mysql_back
[root@localhost ~]# mysqldump -uroot -p local test >/mysql_back/local_test-$(date +%F).sql
Enter password:
[root@localhost ~]# ls /mysql_back/
local_test-2020-08-10.sql
[root@localhost ~]# mysqladmin -uroot -p flush-logs 生產新的二進制文件
Enter password:
[root@localhost ~]# ls -l /usr/local/mysql/mysql-bin.*
-rw-rw----. 1 mysql mysql 894 8月 10 10:03 /usr/local/mysql/mysql-bin.000001
-rw-rw----. 1 mysql mysql 120 8月 10 10:03 /usr/local/mysql/mysql-bin.000002
-rw-rw----. 1 mysql mysql 68 8月 10 10:03 /usr/local/mysql/mysql-bin.index
3) 繼續錄入新的數據并進行增量備份
mysql> insert into test values(3);
Query OK, 1 row affected (0.01 sec)
mysql> insert into test values(4);
Query OK, 1 row affected (0.00 sec)
[root@localhost ~]# mysqladmin -uroot -p flush-logs
Enter password:
[root@localhost ~]# ls -l /usr/local/mysql/mysql-bin.*
-rw-rw----. 1 mysql mysql 894 8月 10 10:03 /usr/local/mysql/mysql-bin.000001
-rw-rw----. 1 mysql mysql 595 8月 10 10:06 /usr/local/mysql/mysql-bin.000002
-rw-rw----. 1 mysql mysql 120 8月 10 10:06 /usr/local/mysql/mysql-bin.000003
-rw-rw----. 1 mysql mysql 102 8月 10 10:06 /usr/local/mysql/mysql-bin.index
[root@localhost ~]# cp /usr/local/mysql/mysql-bin.000002 /mysql_back/
如此00003就保留插入2個數據的操作。
4) 模擬誤操作刪除test表
[root@localhost ~]# mysql -uroot -p -e 'drop table local.test;' 刪除
Enter password:
[root@localhost ~]# mysql -uroot -p -e 'select * from local.test;' 查詢
Enter password:
ERROR 1146 (42S02) at line 1: Table 'local.test' doesn't exist
5) 恢復操作
在執行恢復操作時,需要先恢復完全備份,然后恢復增量備份。
[root@localhost mysql_back]# mysql -uroot -p local </mysql_back/local_test-2020-08-10.sql
Enter password:
[root@localhost mysql_back]# mysql -uroot -p -e ' select * from local.test;'
Enter password:
+------+
| id |
+------+
| 1 |
| 2 |
+------+ 注意:缺少3.4數據使用增量備份恢復
[root@localhost mysql_back]# mysqlbinlog --no-defaults /mysql_back/mysql-bin.000002 | mysql -u root -p
Enter password:
[root@localhost mysql_back]# mysql -uroot -p -e ' select * from local.test;'
Enter password:
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
2、 給予位置恢復
由于前面做過備份操作,接下來直接進行模擬故障與數據恢復的操作。
+------+
[root@localhost mysql_back]# mysql -uroot -p -e 'drop table local.test;'
Enter password: //模擬誤操作刪除test表
[root@localhost mysql_back]# mysql -uroot -p -e 'select * from local.test;'
Enter password: //查看test表是否存在
ERROR 1146 (42S02) at line 1: Table 'local.test' doesn't exist
[root@localhost mysql_back]# mysql -uroot -p local </mysql_back/local_test-2020-08-10.sql
Enter password: //恢復完全備份
想要實現基于位置或時間點恢復數據,必須先通過查看二進制日志文件確定恢復的位置或時間點。
[root@localhost /]# mysqlbinlog --no-defaults --stop-position='548' /mysql_back/mysql-bin.000002 | mysql -uroot -p
Enter password:
[root@localhost /]# mysql -uroot -p -e ' select * from local.test;'
Enter password:
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 3 |
| 4 |
+------+
3、 基于時間點恢復 只恢復10:05:19的數據,即不恢復4的信息
mysql> drop tables test; 刪除test表
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# mysqlbinlog --no-defaults --stop-datetime='2020-8-10 10:05:21' /mysql_back/mysql-bin.000002 | mysql -uroot -p
Enter password:
執行以上操作就是恢復在10:05:21之前的所有數據。
4、 制定企業備份策略的思路