MySQL 完整備份案例及備份恢復腳本


一、MySQL完整備份案例(本機的備份)

1、先創建一個數據庫、數據表、寫入數據信息

MariaDB [(none)]> create database client;

MariaDB [(none)]> use client

修改配置文件(支持中文)

[root@localhost ~]# vim /etc/my.cnf           

更改的內容:

character_set_server = utf8
collation-server = utf8_general_ci

[client]
default-character-set = utf8

MariaDB [(client)]> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

 

MariaDB [client]> create table user_info(身份證 int(20),姓名 char(20),性別 char(2),用ID號 int(110),資費 int(100));
Query OK, 0 rows affected (0.01 sec)

MariaDB [client]> insert into user_info values('000000001','孫空武','男','011','100');
Query OK, 1 row affected (0.00 sec)

MariaDB [client]> insert into user_info values('000000002','藍凌','女','012','98');
Query OK, 1 row affected (0.01 sec)

MariaDB [client]> insert into user_info values('000000003','姜紋','女','013','12');
Query OK, 1 row affected (0.01 sec)

MariaDB [client]> insert into user_info values('000000004','關園','男','014','38');
Query OK, 1 row affected (0.01 sec)

MariaDB [client]> insert into user_info values('000000005','羅中昆','男','015','39');
Query OK, 1 row affected (0.01 sec)

MariaDB [client]> select * from user_info;
+-----------+-----------+--------+-------------+--------+
| 身份證 | 姓名 | 性別 | 用戶ID號 | 資費 |
+-----------+-----------+--------+-------------+--------+
| 1 | 孫空武 | 男 | 11 | 100 |
| 2 | 藍凌 | 女 | 12 | 98 |
| 3 | 姜紋 | 女 | 13 | 12 |
| 4 | 關園 | 男 | 14 | 38 |
| 5 | 羅中昆 | 男 | 15 | 39 |
+-----------+-----------+--------+-------------+--------+
5 rows in set (0.00 sec)

2、首先完整備份client.user_info表:

[root@localhost ~]# mysqldump -uroot -p123 client user_info > backup/client.user_info-$(date +%Y%m%d).sql

模擬數據丟失並且恢復數據:

[root@localhost ~]# mysql -uroot -p123 -e 'drop table client.user_info;'
[root@localhost ~]# mysql -uroot -p123 -e 'use client;show tables;'

[root@localhost ~]# mysql -uroot -p123 client < backup/client.user_info-20191013.sql
[root@localhost ~]# mysql -uroot -p123 -e 'use client;show tables;'
+------------------+
| Tables_in_client |
+------------------+
| user_info |
+------------------+

[root@localhost ~]# mysql -uroot -p123 -e 'use client;select * from user_info;'
+-----------+-----------+--------+-------------+--------+
| 身份證 | 姓名 | 性別 | 用戶ID號 | 資費 |
+-----------+-----------+--------+-------------+--------+
| 1 | 孫空武 | 男 | 11 | 100 |
| 2 | 藍凌 | 女 | 12 | 98 |
| 3 | 姜紋 | 女 | 13 | 12 |
| 4 | 關園 | 男 | 14 | 38 |
| 5 | 羅中昆 | 男 | 15 | 39 |
+-----------+-----------+--------+-------------+--------

定期的備份數據:

寫一個小腳本:

[root@localhost ~]# vim /opt/client_bak.sh

 里面添加以下內容:

#!/bin/bash
mysqldump -uroot -p123 client user_info > backup/client.user_info-$(date +%Y%m%d).sql

[root@localhost ~]# crontab -e                   //每天的凌晨兩點執行這一個腳本
0 2 * * * /opt/client_bak.sh

[root@localhost ~]# systemctl restart crond        //重啟一下計划任務

crond的格式:分  時  日 月 周 計划任務

二、跨主機的備份

實驗環境:虛擬機ip:192.168.200.111、192.168.200.112

實驗要求:對mysql-server的auth庫和client庫實現異地備份,每天凌晨兩點進行備份,撰寫一個數據恢復的腳本。

112:[root@localhost ~]# yum -y install mariadb                //安裝一下mariadb

1、mysql服務端授權給客戶端select和lock tables權限,以備份

MariaDB [(none)]> grant select,lock tables on auth.* to 'admin'@'192.168.200.112' identified by '123';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> grant select,lock tables on client.* to 'admin'@'192.168.200.112' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;                          // 刷新授權表
Query OK, 0 rows affected (0.00 sec)

2、連接測試

[root@localhost ~]# mysql -uadmin -p123 -h 192.168.200.111
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 21
Server version: 5.5.41-MariaDB MariaDB Server

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

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

MariaDB [(none)]>

3、撰寫客戶端備份腳本:

[root@localhost ~]# vim /opt/bakmysql.sh

#!/bin/bash
# MySQL數據庫備份腳本
# 設置登錄變量
MY_USER="admin"
MY_PASS="123"
MY_HOST="192.168.200.111"
MY_CONN="-u$MY_USER -p$MY_PASS -h$MY_HOST"
# 設置備份的數據庫
MY_DB1="auth"
MY_DB2="client"
# 定義備份路徑、工具、時間、文件名
BF_DIR="backup"
BF_CMD="/usr/bin/mysqldump"
BF_TIME=$(date +%Y%m%d-%H%M)
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
# 備份為.sql腳本,然后打包壓縮(打包后刪除原文件)
[ -d $BF_DIR ] || mkdir -p $BF_DIR
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &>/dev/null
/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &>/dev/null

[root@localhost ~]# chmod +x /opt/bakmysql.sh
[root@localhost ~]# /opt/bakmysql.sh

[root@localhost ~]# ls backup/
auth-20191014-0909.tar.gz client-20191014-0909.tar.gz

添加計划任務:

[root@localhost ~]# crontab -e

0 2 * * * /opt/bakmysql.sh

[root@localhost ~]# systemctl restart crond

4、撰寫數據恢復的腳本:

 [root@localhost ~]# vim /opt/restore_mysql.sh

#!/bin/bash
# 恢復MySQL數據庫數據腳本
# 設置變量

MY_USER="admin"
MY_PASS="123"
MY_HOST="192.168.200.111"
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 20160501 ] && [ $dt -le 20160601 ];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 |awk /$nb/'{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 < .bbb/*
echo "$nm已恢復到$dt"
rm -rf .bbb
cd - &>/dev/null
rm -rf .aaa
fi
else
echo "很抱歉,您恢復的數據庫的備份日期不在備份日期范圍內"
fi

[root@localhost ~]# chmod +x /opt/restore_mysql.sh

如在客戶端恢復數據,需要開放權限

111:

MariaDB [(none)]> grant all on auth.* to 'admin'@'192.168.200.112';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on client.* to 'admin'@'192.168.200.112';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> drop database client;                     //將client刪除再做數據恢復
Query OK, 1 row affected (0.01 sec)

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM