mysql增量備份與恢復
- 使用mysqldump進行完全備份,會有數據重復,而且數據較大時間過長。
- 增量備份可根據需求恢復
mysql二進制對備份的意義
- 二進制日志文件保存了數據庫操作(sql語句)
- 當日志文件達到max——binlog——size所設置的大小或者接收到flush-log命令重新創建新的日志文件
vim /etc/my.cnf
max_binlog_size = 1024000 #最大為1M
log-bin=myslq-bin #打開日志
#需重啟
mysql增量備份
- 人為sql語句損失,數據庫故障丟失
- mysqlbinlog [--no-defaults] 增量備份文件 | mysql -u -p #二進制文件完全恢復
- mysqlbinlog [--no-defaults] --stop-datatime='年-月-日 小時:分鍾:秒' 二進制文件 | mysql -u -p #更具實踐需求恢復二進制文件
- mysqlbinlog [--no-defaults] --start-datatime='年-月-日 小時:分鍾:秒' 二進制文件 | mysql -u -p #從某時間點到時間結尾恢復
- mysqlbinlog [--no-defaults] --start-datatime='年-月-日 小時:分鍾:秒' --stop-datatime='年-月-日 小時:分鍾:秒' 二進制文件 | mysql -u -p #從某時間到某時間點恢復
- mysqlbinlog --stop-position='操作 id' 二進制日志 | mysql -u -p #位置
mysqlbinlog --start-position='操作 id' 二進制日志 | mysql -u -p
制定企業備份策略的思路
- 在半夜三點合適的時間根據公司數據大小來備份
- 數據大的話一周完全備份一次,小的話一天一次
實驗
mysql -uroot -p
create databases client;
use client;
#首先保證能實用漢語:my.cnf中設置character_set_server=utf8
create table user_info(身份證 char(20)not unll,姓名 cahr(20)not unll,性別 cahr(2),用戶id號 cahr(10)not null,資費 int(10));
insert into user_info values('000000006','張三','男','018','15');
insert into user_info values('000000007','李四','男','029','16');
insert into user_info values('000000008','whml','男','020','17');
select * from user_info;
#第一次完全備份
mkdir /mysql_bak #創建目錄
mysqldump -uroot -p123123 client user_info > /mysql_bak/client_user_info-$(date +%F).sql #將庫保存在目錄
mysqldump -uroot -p123123 --databases client > /mysql_bak/client-$(date +%F).sql #將庫中的表保存在目錄下
[root@localhost ~]# ls /mysql_bak/
client-2021-10-13.sql client_user_info-2021-10-13.sql
#進行一次日志回滾(生成新的日志文件)
mysqladmin -uroot -p123123 flush-logs
#繼續錄入新的數據
insert into user_info values('000000009','wml','男','2007','26');
insert into user_info values('000000010','mhm','女','1909','13');
#進行增量備份
cp /var/lib/mysql/mysql-bin.000002 /mysql_bak/ #保存日志文件
#模擬刪除
mysql -uroot -p123123 -e 'drop table client.use_info;'
mysql -uroot -p123123 -e 'select * from client.user_info'
#恢復完全備份
mysql -uroot -p123123 client < /mysql_bak/client-2021-10-13.sql
mysql -uroot -p123123 -e 'select * from client.user_info' #此時里面就有我們前面的三個數據
#恢復增量備份
mysqlbinlog --no-defaults /root/mysql_bak/mysql-bin.000002 | mysql -uroot -p123123 #此時里面就有我們一直到最后的數據
#基於時間點的增量備份
mysql -uroot -p123123 client < /mysql_bak/client-2021-10-13.sql #先進行完全恢復
mysqlbinlog --no-defaults --stop-datatime='2021-10-13 15:10:13' /mysql_bak/mysqk-bin.000002 | grep -uroot -p123123 #此時一直恢復到此時間的數據
#跳過某個時間的sql語句
mysql -uroot -p123123 client < /mysql_bak/client-2021-10-13.sql #先進行完全恢復
mysqlbinlog --no-defaults --start-datatime='2021-10-13 15:10:13' /mysql_bak/mysqk-bin.000002 | grep -uroot -p123123
#基於位置的恢復
mysql -uroot -p123123 client < /mysql_bak/client-2021-10-13.sql #先進行完全恢復
mysqlbinlog --no-defaults --stop-position='774' /mysql_bak/mysql-bin.000002 | mysql -uroot -p123123 #一直恢復到此位置
#使用腳本完全備份
chmod +x /opt/mysql_bak_wanbei.sh #給腳本增加執行權限
#給其周期計划執行腳本
定期重新更新日志腳本
完全備份腳本
#!/bin/bash
# MySQL數據庫完全備份腳本
# 設置登錄變量
MY_USER="root"
MY_PASS="123123"
MY_HOST="localhost"
MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"
# 設置備份的數據庫(或表)
MY_DB="client"
# 定義備份路徑、工具、時間、文件名
BF_DIR="/mysql_bak/wanbei"
BF_CMD="/usr/bin/mysqldump"
BF_TIME=$(date +%Y%m%d-%H%M)
NAME="$MY_DB-$BF_TIME"
# 備份為.sql腳本,然后打包壓縮(打包后刪除原文件)
[ -d $BF_DIR ] || mkdir -p $BF_DIR
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB > $NAME.sql
/bin/tar zcf $NAME.tar.gz $NAME.sql --remove &>/dev/null
增量備份腳本
#!/bin/bash
# MySQL數據庫增量備份腳本
# 設置登錄變量
MY_USER="root"
MY_PASS="123123"
MY_HOST="localhost"
MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"
# 定義備份路徑、工具、二進制日志前綴、二進制日志存放路徑
BF_TIME="$(date +%Y%m%d)"
BF_DIR="/mysql_bak/zengbei/$BF_TIME"
CMD="/usr/bin/mysqladmin"
QZ="mysql-bin"
LOG_DIR="/var/lib/mysql"
# 拷貝二進制日志
[ -d $BF_DIR ] || mkdir -p $BF_DIR
$CMD $MY_CONN flush-logs
/bin/cp -p $(ls $LOG_DIR/$QZ.* |awk -v RS="" '{print $(NF-2)}') $BF_DIR
智能恢復備份腳本(客戶機上)
#!/bin/bash
# 恢復MySQL數據庫數據腳本
# 設置變量
MY_USER="admin"
MY_PASS="123123"
MY_HOST="192.168.200.100" #數據庫
BF_DIR="backup"
mkdir .aaa
ls $BF_DIR |column -t > .aaa/db_list
awk -F'-' '{print $2}' .aaa/db_list > .aaa/dt.txt
read -p "請指定要恢復數據庫的日期(YYYYMMDD):" dt
if [ $dt -ge 20211001 ] && [ $dt -le 20211031 ];then
grep "$dt" .aaa/dt.txt &>/dev/null
if [ $? -ne 0 ];then
echo "很抱歉,您恢復數據庫的備份日期不再備份日期范圍內"
else
echo "搜索到的可恢復數據庫如下:"
awk -F'-' /$dt/'{print NR,$1}' .aaa/db_list
read -p "請選擇您要恢復數據庫的編號: " nb
nm=$(awk -F'-' /$dt/'{print NR,$1}' .aaa/db_list |grep "$nb" |awk '{print $2}')
echo "現在開始恢復數據庫:$nm到$dt"
cd $BF_DIR
onm=$(ls |grep "$nm-$dt")
mkdir .bbb
tar xf $onm -C .bbb
mysql -u$MY_USER -p$MY_PASS -h$MY_HOST $nm < .bbb/*
echo "$nm已經恢復到$dt"
rm -rf .bbb
cd - &>/dev/null
rm -rf .aaa
fi
else
echo "很抱歉,您恢復數據庫的備份日期不再備份日期范圍內"
fi