天天看點

關于Linux中資料備份的一些總結

寫在前面

  • 一般需求增量上線的時候,會備份寫資料,保證更新失敗也可以回退回去,今天和小夥伴聊聊資料備份的事。
  • 日常備份可以通過定時任務進行備份,也可以走動執行備份
  • 這裡和小夥分享一些備份的腳本Demo,寫的很粗。
  • 博文内容包括:

    日志備份

    資料庫備份(mysql)

  • 備份方式分為:

    實體備份

    邏輯備份

    遠端差異備份

等長大就明白了。”小時候總是被人這麼說。但那是不折不扣的謊言。我對任何事都隻能越來越不明白。……這的确令人不安。但在另一方面,正是因為這樣,自己才沒有失去對生的好奇這也是事實。 ——中島敦《山月記》

*

一、日志檔案備份

日志備份這裡很簡單,這裡我們寫一個shell腳本,通過腳本的方式進行,當然,如果需要,這個腳本可以配置到定時任務裡。

┌──[[email protected]]-[~]
└─$ pwd
/root
┌──[[email protected]]-[~]
└─$ mkdir bak_shell
┌──[[email protected]]-[~]
└─$ cd bak_shell/
┌──[[email protected]]-[~/bak_shell]
└─$ vim bak_log.sh
┌──[[email protected]]-[~/bak_shell]
└─$ sh bak_log.sh
┌──[[email protected]]-[~/bak_shell]
└─$ cat bak_log.sh
#!/bin/bash
###此腳本運用日期定義備份的檔案名,友善與每天進行備份不重複
date=`date +"%Y%m%d%H%M%S"`
if [ ! -f /tmp/log-$date.tar.gz ];then
tar -zcPf /tmp/log-$date.tar.gz /var/log
fi
┌──[[email protected]]-[/tmp]
└─$ cd /tmp/;ll -h | grep log-*
-rw-r--r-- 1 root root 4.4M 11月 15 10:51 log-20211115110510.tar.gz
┌──[[email protected]]-[/tmp]
└─$           

二、資料庫備份

關系資料庫備份,這裡我們用實體機直接操作,用容器也是一樣的。

1、邏輯備份(SQL備份)

###安裝mariadb資料庫,重新開機服務
┌──[[email protected]]-[/tmp]
└─$ yum -y install mariadb mariadb-server
┌──[[email protected]]-[/tmp]
└─$ systemctl restart mariadb
####檢視資料庫服務的程序資訊
┌──[[email protected]]-[/tmp]
└─$ ss -ntulpa | grep mysql
tcp    LISTEN     0      50        *:3306                  *:*                   users:(("mysqld",pid=52010,fd=14))
┌──[[email protected]]-[/tmp]
└─$ # 登入測試下
┌──[[email protected]]-[/var/lib/mysql]
└─$ mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use test
Database changed
MariaDB [test]> show tables
    -> ;
Empty set (0.00 sec)

MariaDB [test]>           

mysqldump

可以對

mysql

資料庫中的庫進行備份,一般的資料庫都會提供相應的備份工具,比如

MongoDB

mongodump

##mysqldump可以對資料庫中的庫進行備份
##格式: mysqldump -u"使用者名" --password="" 資料庫名 > 備份名.sql
┌──[[email protected]]-[/]
└─$ mysqldump mysql > mysql.sql
┌──[[email protected]]-[/]
└─$ ll | grep mysql*
-rw-r--r--    1 root root  514667 11月 15 15:52 mysql.sql           

腳本編寫

┌──[[email protected]]-[/]
└─$ mkdir mysql;cd mysql
┌──[[email protected]]-[/mysql]
└─$ vim mysqldump.sh
┌──[[email protected]]-[/mysql]
└─$ sh mysqldump.sh
┌──[[email protected]]-[/tmp]
└─$ cd /tmp/;ls -h |  grep *.sql
mysql-20211115160404.sql
┌──[[email protected]]-[/tmp]
└─$ cat /mysql/mysqldump.sh
#!/bin/bash
###date 指定備份資料名;iuser 指定登入資料庫的使用者
###ipass 指定登入密碼,預設為空;db 指定要備份的資料庫
date=$(date +"%Y%m%d%H%M%S")
iuser=root
ipass=
db=mysql
###檔案在/tmp 下不存在時才會進行備份
if [ ! -f /tmp/$db-$date.sql ];then
mysqldump -u$iuser --password="$ipass" $db > /tmp/$db-$date.sql
fi
┌──[[email protected]]-[/tmp]
└─$           

2、實體備份(buttaidong)

實體備份即直接備份相關檔案,mysql預設的表資料相關檔案在

/var/lib/mysql

┌──[[email protected]]-[/tmp]
└─$ cd /mysql
┌──[[email protected]]-[/mysql]
└─$ ls
mysqldump.sh
┌──[[email protected]]-[/mysql]
└─$ vim bak_mysql.sh
┌──[[email protected]]-[/mysql]
└─$ sh bak_mysql.sh
tar: 從成員名中删除開頭的“/”
tar: 從成員名中删除開頭的“/”
tar: 從成員名中删除開頭的“/”
。。。。。
┌──[[email protected]]-[/tmp]
└─$ cd mysql/
┌──[[email protected]]-[/tmp/mysql]
└─$ ls
columns_priv.frm-20211115160950.tar.gz      proc.frm-20211115160950.tar.gz
columns_priv.MYD-20211115160950.tar.gz      proc.MYD-20211115160950.tar.gz
。。。。。。
┌──[[email protected]]-[/mysql]
└─$ cat bak_mysql.sh
#!/bin/bash
###對資料庫中的mysql庫下每一個表都進行打包備份;備份檔案存放在/tmp/mysql目錄下
date=$(date +"%Y%m%d%H%M%S")
db_dir="/var/lib/mysql"
db=mysql

[ ! -d /tmp/$db ] && mkdir /tmp/$db
for i in $(ls $db_dir/$db)
do
tar -zcf /tmp/$db/$i-$date.tar.gz $db_dir/$db/$i
done
┌──[[email protected]]-[/mysql]
└─$           

這個的tar報錯加了個 P參數就不報了,但是沒必要,可以正常打包

3、差異備份 inotify+rsync

所謂差異備份,即通過inotify 來監聽檔案變化,通rsync來增量同步資料。

這裡我們本機模拟一下,一般是備份到遠端機器上的,備份前一定做ssh免密

ssh-copy-id [email protected]

部署安裝rsync同步軟體、inotifywait 監聽軟體

┌──[[email protected]]-[/var/www/html]
└─$ yum -y install rsync
┌──[[email protected]]-[/mysql]
└─$ yum search inotify-tools
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
============================================== N/S matched: inotify-tools ===============================================
inotify-tools.x86_64 : Command line utilities for inotify
inotify-tools-devel.x86_64 : Headers and libraries for building apps that use libinotifytools

  名稱和簡介比對 only,使用“search all”試試。
┌──[[email protected]]-[/mysql]
└─$ yum -y install inotify-tools
┌──[[email protected]]-[/mysql]
└─$  rpm -qal  inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz           

差異備份【inotify+rsync】

進行模拟差異備份

┌──[[email protected]]-[~]
└─$ mkdir rsync;cd rsync
┌──[[email protected]]-[~/rsync]
└─$ vim isync.sh
┌──[[email protected]]-[~/rsync]
└─$ mkdir /root/liruilong
┌──[[email protected]]-[~/rsync]
└─$ sh isync.sh &
[1] 17575
┌──[[email protected]]-[~/rsync]
└─$ cd /root/liruilong/
┌──[[email protected]]-[~/liruilong]
└─$ ls
┌──[[email protected]]-[~/liruilong]
└─$ cd /var/www/html/
┌──[[email protected]]-[/var/www/html]
└─$ echo "123456" > liruilong.txt
┌──[[email protected]]-[/var/www/html]
└─$ cat liruilong.txt
123456
┌──[[email protected]]-[/var/www/html]
└─$ cd /root/liruilong/
┌──[[email protected]]-[~/liruilong]
└─$ ls
liruilong.txt
┌──[[email protected]]-[~/liruilong]
└─$ cat liruilong.txt
123456
┌──[[email protected]]-[~/liruilong]
└─$ jobs
[1]+  運作中               sh isync.sh &(工作目錄:~/rsync)
┌──[[email protected]]-[~/liruilong]
└─$           

備份腳本

┌──[[email protected]]-[~/rsync]
└─$ ls
isync.sh
┌──[[email protected]]-[~/rsync]
└─$ cat isync.sh
#!/bin/bash
##from_dir 為要被同步的目錄
from_dir="/var/www/html/"
##将$from_dir下的内容,同步到本機的/root/liruilong/目錄下
rsync_cmd="rsync -az --delete $from_dir [email protected]:/root/liruilong"
##inotifywait監聽 $from_dir 目錄,目錄下發生檔案的變化時,執行同步操作,腳本背景運作
while inotifywait -rqq -e modify,move,create,delete,attrib $from_dir
do
$rsync_cmd
done
┌──[[email protected]]-[~/rsync]
└─$           
關于Linux中資料備份的一些總結