mysql數據庫全量備份和增量備份(docker容器部署方式)

 

1、創建備份數據庫容器(參考監控相關下面的mysql安裝)

# 建立掛載的數據卷

mkdir -p /opt/mysql/data
 
# 虛擬機 3307 端口和容器裏的3306端口對應,虛擬機路徑和容器里路徑(下圖,來自頭部參考地址)對應
docker run -p 3307:3306 --restart="always" --name iptv-mysqlbackup -v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysqlbackup/daily:/opt/mysqlbackup/daily -v /opt/mysqlbackup/backup:/opt/mysqlbackup/backup -e MYSQL_ROOT_PASSWORD=123456 -d --privileged=true iptv-mysqlbackup
 
 

2、yum安裝包存放在目錄/var/cache/yum/package,將之拷貝到容器裏

docker cp crontabs-1.11-6.20121102git.el7.noarch.rpm mysql:/usr/share/package
 
 
進入到容器的當前目錄下通過rpm離線安裝相關軟件
 
rpm -Uvh --force --nodeps *.rpm
 
 
以上方式可通過apt安裝,貌似要聯網
安裝vim apt-get update && apt-get install vim
安裝定時任務 apt-get install cron  
安裝yum指令 apt-get install yum
 
 

3、新建備份腳本

 
備份準備工作
創建目錄
mkdir -p  /opt/mysqlbackup
touch  backup.sh
 
文件賦權
chmod +x /opt/mysqlbackup/backup.sh
 
全量備份腳本
cat >/opt/mysqlbackup/backup.sh <<EOF
#!/bin/sh
zcDATE=$(date +%Y%m%d)
mkdir -p /opt/mysqlbackup/backup/$zcDATE
mysqldump -h '192.168.1.36' -uroot -p'123456'  --quick --events  --databases mysql --flush-logs --delete-master-logs --single-transaction > /opt/mysqlbackup/backup/$zcDATE/mysql.sql
EOF
 
 
 
MySQL上存在兩個數據庫,名稱分別是 db1 和 db2,利用這種方式在硬盤上備份數據。-h表示遠程的服務器IP。-u 和 -p 分別是遠程服務器的用戶名和密碼。這裏不建議使用 mysqldump 的 –-all-database 選項。因爲該選項會把遠程MySQL裏的系統數據庫也備份下來,包括 root 用戶的密碼等內容。如果你要把導出的內容導入到別的機器上,這些系統設置(比如用戶名和密碼)會覆蓋你的機器上原來的設置
增量備份數據庫設置
查看mysql日誌是否開啓show variables like '%log_bin%'
進入到mysql容器 docker exec -ti mysql bash
修改配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf
加上兩行
log-bin=/var/lib/mysql/mysql-bin
server-id=123454
set global expire_logs_days = 3;
 
重啓mysql   docker restart mysql
 
 
增量備份命令sh文件,內容如下
 
BakDir=/opt/mysqlbackup/daily
BinDir=/var/lib/mysql
BinFile=/var/lib/mysql/mysql-bin.index
 
mysqladmin -h '192.168.1.36' -uroot -p123456 flush-logs
Counter=`wc -l $BinFile | awk '{print $1}'`
NextNum=0
chomd +x BinDir
for file in `cat $BinFile`
do
        base=`basename $file`
        NextNum=`expr $NextNum + 1`
        if [ $NextNum -eq $Counter ]
        then
                echo $base skip! >> $LogFile
        else
                dest=$BakDir/$base
                if(test -e $dest)
                then
                        echo $base exist! >> $LogFile
                else
                        cp $BinDir/$base $BakDir
                        echo $base copying >> $LogFile
                fi
        fi
done
 
 
echo `date +"%Y%m%d %H:%M:%S"` $Next Bakup succ! >> $LogFile
 
 
 

4、設置定時任務

 
crontab -e
加上如下配置
 
*/1 * * * *  /opt/mysqlbackup/backup.sh    (測試設置每分鐘試試)
0 19 * * 1,3,5 /opt/mysqlbackup/backup.sh   (線網穩定後設置每週1,3,5執行)
50 1 * * *  /opt/mysqlbackup/backup.sh     (線網穩定前設置每天執行)
 
舉例
# Use the hash sign to prefix a comment
    # +---------------- minute (0 - 59)
    # |  +------------- hour (0 - 23)
    # |  |  +---------- day of month (1 - 31)
    # |  |  |  +------- month (1 - 12)
    # |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *  command to be executed
    #--------------------------------------------------------------------------
    # Run my cron job every Monday, Wednesady and Friday at 7:00PM
0 19 * * 1,3,5 nohup /home/lathonez/script.sh > /tmp/script.log 2>&1
 
●30 5 * * * root /sbin/init 6 這樣就將系統配置爲了每天早上5點30自動重新啓動。
● 0 /2 * * /sbin/service httpd restart 意思是每兩個小時重啓一次apache
● 50 1 * * * /sbin/service sshd start 意思是每天1:50開啓ssh服務
● 50 22 * * * /sbin/service sshd stop 意思是每天22:50關閉ssh服務
● 0 0 1,15 * * fsck /home 每月1號和15號檢查/home 磁盤
● 1 * * * * /home/bruce/backup 每小時的第一分執行 /home/bruce/backup這個文件
● 00 03 * * 1-5 find /home “.xxx” -mtime +4 -exec rm {} /; 每週一至週五3點鐘,在目錄/home中,查找文件名爲.xxx的文件,並刪除4天前的文件。
● 30 6 /10 * ls 意思是每月的1、11、21、31日是的6:30執行一次ls命令

5、啓動定時任務

 
命令: service cron start 開啓服務
命令: service cron stop 關閉服務
命令: service cron restart 重啓服務
命令: service cron reload 重新載入配置
service cron status 查看狀態
 
 
由於定時任務依賴於時間,所以還需要對時區進行設置
linux下時區設置:================================
tzselect #設置時區  依次選擇5 9 1 1
export TZ=Asia/Shanghai
 
docker下時區設置:================================
cp /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime
 
 

6、想要查看定時任務日誌,需要安裝syslog

 
安裝syslog apt-get install rsyslog
編輯日誌配置文件 vi /etc/rsyslog.conf
cron.*    /var/log/cron.log #將cron前面的註釋符去掉
重啓rsyslog 
service rsyslog  restart
查看日誌文件
tail -f /var/log/cron.log
 
 
 

7、恢復數據庫導入

 
按照位置生成恢復日誌
show master status ;  查詢出當前位置和日誌文件
 
show binlog events in 'mysql-bin.000115';  查看日誌文件對應的操作
 
mysqlbinlog  --stop-position=514 /opt/mysqlbackup/daily/mysql-bin.000114>backup.sql
 
 
按照時間恢復
mysqlbinlog --start-datetime='2019-11-26 16:26:03' --stop-datetime='2019-11-27 10:34:00' /opt/mysqlbackup/daily/mysql-bin.000122 >backup.sql
 
 
將sql文件重新執行一遍用作恢復
mysql -uroot -p123456 mysql<backup.sql
 
 

8、還原數據太慢解決方法

 
 
1.查看變量 innodb_flush_log_at_trx_commit的值
SHOW  VARIABLES LIKE 'innodb_flush_log_at_trx_commit' ;
 
2.查詢結果如果是1的話,將其修改成0
SET GLOBAL innodb_flush_log_at_trx_commit =0;
 
3.這時候再source,會發現速度快了很多,在結束後記得把這個變量重新設置成1
SET GLOBAL innodb_flush_log_at_trx_commit =1;
 
 
速度雖然快了很多,但是不安全,所以導入完之後需要把參數改回去
 
 

9、查看系統操作日誌

 
show variables like 'general_log_file';
 
進入mysql把日誌拷貝出來
docker cp mysql:/var/lib/mysql/cfedc2a3bf2a.log /opt/mysqlbackup/
 
 

10、查看logbin

show binary logs;
show variables like '%log_bin%';
show master status ;
 
 
服務器部署的時候記得進入容器啓動cron服務
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章