1. 程式人生 > >數據備份與恢復 、

數據備份與恢復 、

2.3 check rep reat tables lec 二進制日誌 AR 文件的

數據備份與恢復
1 為什麽要備份數據?
數據丟失或誤刪除時,使用備份文件恢復數據。

2 數據備份方式?
物理備份? 備份庫或表對應文件
cp -r /var/lib/mysql/mysql /opt/mysql.bak
cp /var/lib/mysql/mysql/user.* /opt/

tar -zcvf /opt/mysql.tar.gz /var/lib/mysql/mysql/*

164 cp -r /mydata/mysql.bak/ /var/lib/mysql/mysql
165 chown -R mysql:mysql /var/lib/mysql/mysql
166 systemctl restart mysqld

邏輯備份?備份時根據已有的庫表及記錄生成對應的sql命令,把

sql保存到指定的備份文件裏

3數據備份策略?
完全備份 備份所有數據(一臺服務器 一個庫 一張表)
差異備份 備份自完全備份後所有新產生
增量備份 備份自上一次備份後所有新產生

完全備份+差異備份
完全備份+增量備份

4在生成環境下如何實現數據備份
周期性計劃任務 執行 備份腳本

00 18 * * 1 sh /shell/allbak.sh

5 數據備份時要考慮因素?
備份方式 邏輯備份
備份策略 ?完全 差異 增量
數據備份頻率? 1 小時 1天 1周
數據備份的時間? 數據訪問量小的時候執行備份
存儲空間可擴展? LV
備份文件命名要有標識性? 使用日期做備份文件名


完全備份+差異備份

時間 t1 名
18:00

1 完全 10 1.sql 10
2 差異 3 2.sql 3
3 5 3.sql 8
4 6 4.sql 14
5 1 5.sql 15
6 2 6.sql 17
7 差異 3 7.sql 20


完全備份+增量備份
時間 t1 名
18:00

1 完全 10 1.sql 10
2 增量 3 2.sql 3
3 5 3.sql 5
4 6 4.sql 6
5 1 5.sql 1
6 2 6.sql 2
7 增量 3 7.sql 3


完全備份
時間 t1 名
18:00

1 完全 10 1.sql 10

17:00
2 3 2.sql 13

3 5 3.sql 18
4 6 4.sql 24
5 1 5.sql 25
6 2 6.sql 27
7 3 7.sql 30
++++++++++++++++++++++++++++++++++
完全備份
#mysqldump -hlocalhost -uroot -p123qqq 數據庫名

> 目錄名/名.sql

數據庫名的表示方式?
--all-databases 備份一臺服務上的所有數據
數據庫名 備份一個庫裏的所有表
數據庫名 表名 備份一張表裏的所有數據
-B 數據庫名1 數據庫名2 數據庫名N 備份某幾個庫的所有數據

#mkdir /databak
#mysqldump -uroot -p123qqq userdb >

/databak/userdb.sql

#mysqldump -uroot -p123qqq teadb >

/databak/teadb.sql

完全恢復
#mysql -hlocalhost -uroot -p123qqq 數據庫名 < 目錄

名/名.sql

mysql>drop database teadb;
mysql>create database teadb;
#mysql -uroot -p123qqq teadb < /databak/teadb.sql
mysql> use teadb ; show tables;
#crontab -e
00 18 * * 1 /opt/teadbbak.sh &> /dev/null
00 18 * * 2-7 /opt/baknewbinlogfile.sh

vim /opt/baknewbinlogfile.sh
#!/bin/bash
備份每天新生成的binlog日誌文件且正在使用的binlog日誌文

件不備份
:wq
vim /opt/teadbbak.sh
#!/bin/bash
if [ ! -e /databak ];then
mkdir /databak
fi
day=`date +%F`
mysqldump -uroot -p123qqq --flush-logs teadb >

/databak/teadb-${day}.sql
:wq
# chmod +x /opt/teadbbak.sh

只使用完全備份策略備份數據的缺點:
a 使用完全備份文件恢復數據時只能把數據恢復到備份時的狀態

,完全備份新產生的數據無法恢復。

b 備份和恢復數據時都會對表加寫鎖。
+++++++++++++++++++++++++++++++++++二

、增量備份(啟用mysql服務binlog日誌做時時增量備份、安裝

第3方軟件提供增量備份命令做備份)

2.1啟用mysql服務binlog日誌做時時增量備份
binlog日誌 又叫二進制日誌 ,是mysql數據服務日誌文件的

一種,記錄客戶端連接數據庫服務後,執行的除查詢之外的sql

命令。


mysql -hx.x.x.x -uroot -p123456
mysql> select desc show tables
mysql> create insert update delete grant revoke

啟用binlog日誌
mysql > show variables like "binlog_format";
vim /etc/my.cnf
[mysqld]
server_id=12
log_bin
binlog_format="mixed"
:wq
#systemctl restart mysqld
mysql > show variables like "binlog_format";

ls /var/lib/mysql/主機名-bin.000001 500M+
ls /var/lib/mysql/localhost-bin.index 索引文件

查看binlog日誌文件內容
#mysqlbinlog /var/lib/mysql/localhost-bin.000001

binlog日誌文件記錄sql命令的方式?
時間點
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
pos點
--start-position=數字
--stop-position=數字

執行binlog日誌裏的sql命令恢復數據
#mysqlbinlog [選項] 日誌文件名 | mysql -uroot -

p123qqq

#mysqlbinlog --start-position=300 --stop-

position=1006 /var/lib/mysql/localhost-bin.000001 |

mysql -uroot -p123qqq

手動生成新的binlog日誌?
mysql> flush logs;
# mysql -uroot -p123qqq -e "flush logs"
# systemctl restart mysqld
#mysqldump -uroot -p123qqq --flush-logs teadb t7 >

/databak/t7.sql

刪除已有的binlog日誌文件
mysql> reset master;
mysql> purge master logs to "binlog文件名";
#rm -rf binlog日誌文件

自定義binlog日誌文件存儲的目錄和文件名
# mkdir /logdir
# chown mysql /logdir
# setenforce 0
#vim /etc/my.cnf
server_id=12
#log_bin
log_bin=/logdir/plj
binlog_format="mixed"
:wq
#systemctl restart mysqld
#ls /logdir/
++++++++++++++++++++++++++++
2.3安裝第3方軟件percona提供增量備份命令做備份
一款強大的在線熱備份工具
備份過程中不鎖庫表,適合生產環境
由專業組織Percona提供(改進MySQL分支)

主要含兩個組件
xtrabackup:C程序,支持InnoDB/XtraDB
innobackupex:以Perl腳本封裝xtrabackup,還支持

MyISAM

#yum -y install perl-DBD-MySQL perl-Digest-MD5
#rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
# rpm -ivh percona-xtrabackup-24-2.4.7-

1.el7.x86_64.rpm
# rpm -qa | grep percona
# rpm -ql percona-xtrabackup-24
#man innobackupex
#man xtrabackup

#innobackupex <選項>
1 innobackupex完全備份與恢復
#mkdir /pljdir

# innobackupex --user root --password 123qqq --

databases="teadb" /pljdir --no-timestamp

# innobackupex --user root --password 123qqq --

databases="teadb" --apply-log /pljdir

完全恢復
# cp -r /var/lib/mysql/mysql /opt/mysql.bak
#rm -rf /var/lib/mysql
#mkdir /var/lib/mysql
# innobackupex --user root --password 123qqq --

databases="teadb" --copy-back /pljdir

# cp -r /opt/mysql.bak /var/lib/mysql/mysql
# chown -R mysql:mysql /var/lib/mysql
#systemctl restart mysqld

備份目錄下配置文件說明
backup-my.cnf
xtrabackup_checkpoints
xtrabackup_logfile
ibdata1

數據庫 /var/lib/mysql/
事務日誌文件
lsn 日誌序列號
ib_logfile0
ib_logfile1
ibdata1


重新初始化數據庫目錄下的初始數據
#systemctl stop mysqld
#rm -rf /var/lib/mysql
vim /etc/my.cnf
[mysqld]
#validate_password_policy=0
#validate_password_length=6
:wq
#mysql_install_db --datadir=/var/lib/mysql --

user=mysql
#ls /var/lib/mysql/
#rm -rf /var/lib/mysql/mysql
#cp -r /opt/mysql.bak /var/lib/mysql/mysql
#chown -R mysql:mysql /var/lib/mysql/mysql
#systemctl start mysqld


2 innobackupex增量備份
完全備份 db101.t1 4---999
#innobackupex --user root --password 123456 --

databases="db101.t1" /fullbak --no-timestamp

第1次增量備份 8888
#innobackupex --user root --password 123456 --

databases="db101.t1" --incremental /new1dir --

incremental--basedir=/fullbak --no-timestamp

第2次增量備份 7777
#innobackupex --user root --password 123456 --

databases="db101.t1" --incremental /new2dir --

incremental--basedir=/new1dir --no-timestamp


增量恢復步驟
1 rm -rf /var/lib/mysql/
2 恢復日誌信息
3 恢復數據
4 重啟數據庫服務
5 登錄查看

增量恢復步驟
1 rm -rf /var/lib/mysql/
2 mkdir /var/lib/mysql

2 恢復日誌信息
#innobackupex --user root --password 123456 --

databases="db106.t1" --apply-log --redo-only /onedir

#innobackupex --user root --password 123456 --

databases="db106.t1" --apply-log --redo-only /onedir

--incremental-dir="/dir2"

#innobackupex --user root --password 123456 --

databases="db106.t1" --apply-log --redo-only /onedir

--incremental-dir="/dir3"

3 恢復數據
#innobackupex --user root --password 123456 --

databases="db106.t1" --copy-back /onedir

4 重啟數據庫服務
#cp -r /root/mysql.plj /var/lib/mysql/mysql
#systemctl start mysqld
#chown -R mysql:mysql /var/lib/mysql
#systemctl stop mysqld
#systemctl start mysqld
5 登錄查看
mysql -uroot -p123456
mysql> select * from db1.t1;


+++++++++++++++++++++++++++++++
3 使用完全備份文件恢復某個表的記錄。
db106.a/b/t1
完全備份
#innobackupex --user root --password 123456 --databases="db106" /db106all --no-timestamp

#ls /db106all

#mysql -uroot -p123456
#drop table db106.a;

恢復某個表的記錄
#innobackupex --user root --password 123456 --databases="db106" --apply-log --export /db106all

#ls /db106all/a.*

mysql> create table db106.a(id int);
mysql> alter table db106.a discard tablespace;

mysql> system cp /db106all/db106/a.{ibd,cfg,exp} /var/lib/mysql/db106/

mysql> system chown mysql:mysql /var/lib/mysql/db106/a.*

mysql> alter table db106.a import tablespace;
mysql > select * from db106.a;

數據備份與恢復 、