一、數據備份的重要性
1.備份的主要目的是災難恢復
-
在生產環境中,數據的安全性至關重要
- 任何數據的丟失都可能產生嚴重的后果
- 造成數據丟失的原因:
- 程序錯誤
- 人為,操作錯誤
- 運算錯誤
- 磁盤故障
- 災難(如火災、地震)和盜竊
2.數據庫備份的分類
物理備份:直接對數據庫的數據文件或者日志文件進行備份.
- 冷備份(脫機備份) :是在關閉數據庫的時候進行的
- 熱備份(聯機備份) :數據庫處于運行狀態,依賴于數據庫的日志文件
- 溫備份:數據庫鎖定表格(不可寫入但可讀)的狀態下進行備份操作
邏輯備份:對數據庫的庫或表對象進行備份.
- 即以sql語句的形式,把庫、表結構、表數據保存下來
數據庫的備份策略 :
- 完全備份(全量備份):每次對數據庫進行完整的備份
- 差異備份:備份自從上次完全備份之后被修改過的文件
- 增量備份:只有在上次完全備份或者增量備份后被修改的文件才會被備份
二、MySQL的完全備份與恢復
物理冷備份(完全備份)與恢復? ? tar壓縮打包
systemctl stop mysqld
mkdir /opt/backup #將數據庫備份文件保存到/opt/backup目錄下
[root@localhost backup]# cd /usr/local/mysql/
[root@localhost mysql]# tar zcf /opt/backup/mysql_data-$(date +%F).tar.gz data/
[root@localhost mysql]# cd /opt/backup/
[root@localhost backup]# ls
mysql_data-2024-06-26.tar.gz
[root@localhost backup]# scp mysql_data-2024-06-26.tar.gz 192.168.100.18:~/#發送給備份數據文件的主機的根目錄下~/
再在數據庫備份主機(192.168.100.18)操作恢復數據庫?
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# ls[root@localhost ~]# tar xf mysql_data-2024-06-26.tar.gz
[root@localhost ~]# ls[root@localhost ~]# cd /usr/local/mysql/
[root@localhost mysql]# ls[root@localhost mysql]# mv data/ data_old
[root@localhost mysql]# mv ~/data/ data
[root@localhost mysql]# ls[root@localhost mysql]# systemctl start mysqld
[root@localhost mysql]# mysql -uroot -pabcd1234
mysqldump進行邏輯備份
mysqldump備份數據庫
備份指定數據庫中的文件:
mysqldump -u用戶名 -p密碼 數據庫名 > 指定路徑的絕對路徑/數據庫名.sql
備份指定數據庫和文件:
mysqldump -u用戶名 -p密碼 --databases 數據庫名 > 指定路徑的絕對路徑/數據庫名.sql
備份多個庫及文件
mysqldump -u用戶名 -p密碼 --databases 數據庫1?數據庫2?> 指定路徑的絕對路徑/數據庫名.sql?
備份所有數據庫文件:
mysqldump -u用戶名 -p密碼 --all-databases > 指定路徑的絕對路徑/數據庫名.sql?
邏輯熱備份(完全備份)與恢復
mysqldump實現邏輯備份
mysqldump -u用戶名 -p密碼 --databases 庫1 [庫2 ...] > /存儲路徑/xxx.sql
##備份庫以及庫中所有表的表數據及表結構mysqldump -u用戶名 -p密碼 --all-databases > /存儲路徑/xxx.sql
##備份所有的庫以及其表數據mysqldump -u用戶名 -p密碼 庫名 > /存儲路徑/xxx.sql
##只備份指定庫中的所有表數據,不包含庫對象mysqldump -u用戶名 -p密碼 庫名 表1 [表2 ] > /存儲路徑/xxx.sql
##備份指定庫中的單個或多個表的數據和表結構,不包含庫對象mysqldump -u用戶名 -p密碼 -d 庫名 表1 [表2 ] > /存儲路徑/xxx.sql
##只備份指定庫中的單個或多個表的結構,不包含庫對象,也不包含表的數據
恢復
方法一:
先登錄到數據庫,然后使用source +/存儲路徑/xxx.sql 進行恢復(如果sql文件是只備份了表數據的文件,那么需要先創建庫,并use切換庫后才能執行該命令)方法二:
使用sql語句來進行恢復
mysql -u用戶名 -p密碼 < /存儲路徑/xxx.sql
cat /存儲路徑/xxx.sql | mysql -u用戶名 -p密碼
##恢復庫
mysql -u用戶名 -p密碼 指定庫名 < /存儲路徑/xxx.sql
cat /存儲路徑/xxx.sql | mysql -u用戶名 -p密碼 指定庫名
##恢復庫中的表,且需要庫是存在的
三、MySQL的增量備份與恢復
增量備份是采用的物理二進制日志文件分割來完成增量備份的
啟用相關日志需要? 編輯 /etc/my.cnf 文件內容,末行添加以下內容?
vim /etc/my.cnf#開錯誤日志
log-error=/usr/local/mysql/data/mysql_error.log
#開通用查詢日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#開二進制日志
log_bin=mysql_bin
#開啟慢查詢日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2
重啟mysql并查看日志
[root@zx1 backup]# systemctl restart mysqld
[root@zx1 backup]# cd /usr/local/mysql/data/
[root@zx1 data]# ls
auto.cnf ib_logfile0 mysql_general.log sys
ca-key.pem ib_logfile1 mysql_slow_query.log zx
ca.pem ibtmp1 performance_schema zx1
client-cert.pem mysql private_key.pem zx2
client-key.pem mysql_bin.000001 public_key.pem
ib_buffer_pool mysql_bin.index server-cert.pem
ibdata1 mysql_error.log server-key.pem
[root@zx1 data]# vim /etc/my.cnf
[root@zx1 data]#
刷新生成二進制日志文件的兩種方式:
(1)重啟數據庫服務:systemctl restart mysqld;?
(2)flush-logs命令刷新:mysqladmin -uroot -pabc123 flush-logs;
二進制日志(binlog)有3種不同的記錄格式:
STATEMENT(基于SQL語句):默認格式是STATEMENT。該方式記錄語句快,占用內存空間少。但高并發情況下會導致記錄日志順序紊亂,造成恢復數據時發生偏差。
ROW(基于行):基于數據內容行進行記錄,不僅記錄執行的命令語句,還會記錄命令影響的相關數據行。
MIXED(混合模式):高并發情況下ROW方式進行記錄,一般情況下采用STATEMENT方式進行記錄。
1、手動增量備份
手動增量備份的方式有三種:
第一種:手動刷新
mysqladmin -uroot -pabc123 flush-logs第二種:重啟mysqld服務
systemctl restart mysqld第三種:二進制日志文件的大小達到1G的時候會進行自動分割
與max_binlog_size大小相關
默認為1073741824字節等于1G
2、增量備份恢復
mysqlbinlog --no-defaults 指定binlog |mysql -u用戶名 -p密碼
[root@ll data]# cd /root/back-everyday/
[root@zll back-everyday]# ls
mysql_bin.20240624 mysql_bin.20240625 mysql_bin.20240626
[root@ll back-everyday]# mysqlbinlog --no-defaults mysql_bin.20240625 | mysql -u root -pabc123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@ll back-everyday]# mysql -u root -pabc123 -e 'select * from zx.zx;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+------+
| id | name | sex | age |
+----+------+------+------+
| 1 | scj | 男 | 20 |
| 2 | zx | 男 | 21 |
| 3 | tc | 男 | 20 |
| 4 | ctt | 女 | 20 |
| 5 | jlh | 男 | 20 |
+----+------+------+------+
[root@ll back-everyday]# mysqlbinlog --no-defaults mysql_bin.20240626 | mysql -u root -pabc123
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@ll back-everyday]# mysql -u root -pabc123 -e 'select * from zx.zx;' mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+------+
| id | name | sex | age |
+----+------+------+------+
| 1 | scj | 男 | 20 |
| 2 | zx | 男 | 21 |
| 3 | tc | 男 | 20 |
| 4 | ctt | 女 | 20 |
| 5 | jlh | 男 | 20 |
| 6 | zyr | 男 | 20 |
| 7 | tj | 男 | 20 |
+----+------+------+------+
4、增量備份斷點恢復
第一種:基于位置恢復
基于位置點恢復
mysqlbinlog --no-defaults --start-position="" --stop-position="" 指定binlog |mysql -u用戶名 -p密碼
第二種:基于時間點恢復
基于時間點恢復
mysqlbinlog --no-defaults --start-datetime="" --stop-datetime="" 指定binlog |mysql -u用戶名 -p密碼
如果需要恢復到某條sql語句之前的所有數據,就stop在這個語句的位置點或時間點之前
如果需要恢復某條sql語句及其之后的所有數據,就從這個語句的位置點或時間點開始start?
總結
備份方法
物理備份:直接對數據庫的物理文件(數據文件、日志文件等)進行備份
邏輯備份:對數據庫的庫和表對象以SQL語言的形式導出進行備份備份策略
完全備份:每次備份都備份完整的庫或者表數據
差異備份:只備份上一次完全備份后的更新數據
增量備份:每次備份只備份上一次完全備份或增量備份后的更新數據數據庫上云遷移 冷遷移 物理冷備 先關閉數據庫,再打包備份+恢復熱遷移 阿里云 DTS完全備份
物理冷備:先關閉數據庫,使用tar命令打包備份數據庫的數據目錄和文件 mysql/data/mysqldump邏輯熱備
mysqldump -uXXX -pXXX --databases 庫1 [庫2 ....] > XXX.sql 備份一個或多個庫及庫中所有的表數據
mysqldump -uXXX -pXXX --all-databases > XXX.sql 備份所有的庫
mysqldump -uXXX -pXXX 庫名 > XXX.sql 備份指定庫中的所有的表數據,不包含庫對象
mysqldump -uXXX -pXXX 庫名 表1 [表2 ....] > XXX.sql 備份指定庫中的一個或多個表數據,不包含庫對象xtrabackup物理熱備完全恢復
先登錄到數據庫,再執行 source XXX.sql (如果sql文件是只備份了表數據的文件,需要先創建庫并 use 切換庫后再執行)mysql -uXXX -pXXX < XXX.sql cat XXX.sql | mysql -uXXX -pXXX 恢復庫
mysql -uXXX -pXXX 庫名 < XXX.sql cat XXX.sql | mysql -uXXX -pXXX 庫名 恢復表增量備份
通過刷新二進制日志間接實現增量備份
mysqladmin -uXXX -pXXX flush-logs查看二進制日志內容
mysqlbinlog --no-defaults --base64-output=decode-rows -v <BINLOG>使用二進制日志增量恢復
mysqlbinlog --no-defaults <BINLOG> | mysql -uXXX -pXXX斷點恢復
基于位置點恢復
mysqlbinlog --no-defaults --start-position='開始位置點' --stop-position='結束位置點' <BINLOG> | mysql -uXXX -pXXX基于時間點恢復
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-position='YYYY-mm-dd HH:MM:SS' <BINLOG> | mysql -uXXX -pXXX如果需要恢復到某條sql語句之前的所有數據,就stop在這個語句的位置點或時間點之前
如果需要恢復某條sql語句及其之后的所有數據,就從這個語句的位置點或時間點開始start