Mysql數據庫備份與恢復

1 數據備份與恢復
mysql

2 使用第三方軟件進行備份



1 數據備份與恢復sql

1.1 數據備份方式數據庫

物理備份:直接拷貝庫或者表對應的文件。cp,tar, ...vim

具備侷限性,前提是表的存儲引擎爲myisam,跨平臺性差,數據備份恢復浪費時間。app

邏輯備份:執行備份時,根據已有的數據,生成對應的sql命令,把sql保存到指定的文件裏。恢復時執行備份文件裏的sql命令。ide

1.2 數據備份策略工具

徹底備份:備份全部數據。spa

增量備份:備份自上一次備份以後有變化的數據rest

差別備份:備份自徹底備份以後有變化的數據日誌

徹底備份+增量備份

徹底備份+差別備份

1.3 徹底備份

備份命令:

[root@ser51 ~]#mysqldump -hlocalhost -uroot -p密碼 源庫名 >文件名

源庫名的表示:

--all-databases  全部庫

庫名             指定單個庫

庫名 表名        指定庫的表(注意庫名和表名之間是空格)

-B 數據庫1 數據庫2  備份多個庫

恢復命令:

兩種方式:

(1)[root@ser51 ~]#mysql 鏈接庫操做  目標庫名 <文件名.sql

(2)mysql>source 備份文件路徑;

1.4 增量備份

(1)啓用binlog日誌 實現實時增量備份

binlog日誌介紹:二進制日誌,是mysql數據庫服務日誌文件中的一種,記錄執行的除查詢以外的sql命令。默認沒有啓用。

vim  /etc/my.cnf

[mysqld]

server_id=數值  #數值範圍1-255

log_bin          #啓用默認存放路徑/var/lib/mysql/

binlog_format="mixed"

重啓服務以後生成的文件爲:

/var/lib/mysql/主機名-bin.000001  

#超過500M生成新的(000001-999999)

/var/lib/mysql/localhost-bin.index    #索引文件

#systemctl   restart  mysqld       #重啓服務

(2)查看日誌當前記錄格式

mysql > show variables like "binlog_format";

三種記錄格式:

statement:每一條修改數據的sql命令都會記錄在binlog日誌中;

row:不記錄sql語句上下文相關信息,僅保存哪條記錄被修改。;

mixed:是以上兩種格式的混合使用。

(3)查看binlog日誌文件內容

#mysqlbinlog  /var/lib/mysql/localhost-bin.000001

# mysqlbinlog localhost-bin.000001  | grep -i insert

(4)自定義binlog日誌文件存儲的目錄和文件名

# mkdir /logdir

# chown  mysql  /logdir;  setenforce  0

#vim /etc/my.cnf

server_id=數值  #數值範圍1-255

log_bin=/logdir/mysql   

#自定義存放路徑(mysql至關於主機名,必須寫,無需mkdir)

binlog_format="mixed"

#systemctl  restart  mysqld

#ls  /logdir/

(5)分析binlog日誌

binlog日誌文件記錄sql命令的方式?

時間點

--start-datetime="yyyy-mm-dd  hh:mm:ss"

--stop-datetime="yyyy-mm-dd  hh:mm:ss"

pos點(偏移量)

--start-position=數字     

--stop-position=數字

[root@ser51 logdir]# mysqlbinlog

--start-position=336 --stop-position=1494  mysql.000001

(6)執行binlog日誌裏的sql命令恢復數據

#mysqlbinlog  [選項]  日誌文件名  |  mysql  -uroot  -p123qqq

#mysqlbinlog --start-position=300 --stop-position=1006   /var/lib/mysql/localhost-bin.000001  | mysql  -uroot  -p123456

(7)手動生成新的binlog日誌

第1種:mysql> flush  logs;     #刷新一次生成一次

第2種:mysql -uroot -p123qqq -e "flush logs"

#-e就是以mysql登陸方式執行sql命令

第3種:# systemctl  restart mysqld

第4種:#mysqldump -uroot -p123qqq --flush-logs  teadb t7  > /databak/t7.sql  #備份的時候從新生成

(8)刪除已有的binlog日誌文件

第1種:mysql> reset  master;   #重置全部

第2種:mysql> purge  master  logs  to  "binlog文件名";

#刪除指定binlog以前的日誌

第3種:#rm  -rf   binlog日誌文件

 

2 使用第三方軟件進行備份

2.1 安裝Percona

一款強大的在線熱備份工具,備份過程當中不鎖庫表,適合生產環境。

主要含兩個組件:

xtrabackup:

innobackupex:

[root@ser51 ~]# yum -y install perl-Digest-MD5 perl-DBD-MySQL

#環境不同安裝的依賴包不同

[root@ser51 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm

[root@ser51 ~]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm

2.2 innobackupex徹底備份

(1) 基本選項:

--host  --user  --port   --password  --databases=  

--no-timestamp #不用日期命名備份文件存儲的子目錄名

--redo-only #日誌回滾合併,最後一次增量備份日誌回滾不須要此項

--apply-log #準備還原(回滾日誌)

--copy-back #恢復數據

--incremental 目錄名 #增量備份存放的路徑

--incremental--basedir=目錄名  

#增量備份時,指定上一次備份數據存儲的目錄名

--incremental--dir=目錄名 #恢復數據時,指定增量備份數據存儲的目錄名

--export #導出表信息

import  #導入表空間

恢復數據的時候要求數據庫目錄必須是空的(/var/lib/mysql)

(2) 使用innobackupex作徹底備份和徹底恢復

案例:徹底備份到/allback中

[root@ser51 ~]#innobackupex --user root  --password 123456 --databases="mysql performance_schema sys db66" /allback

#databases:要備份的數據庫名  /allback建立的時候自動生成,無需建立

[root@ser51 ~]#ls /allback/2018-01-22_21-19-33/

#查看生成的備份文件

[root@ser51 ~]#innobackupex --user root  --password 123456 --databases="mysql performance_schema sys db66" --apply-log  /allback/2018-01-22_21-19-33     

#同步日誌

[root@ser51 ~]#rm -rf /var/lib/mysql/  #恢復時要求清空

[root@ser51 ~]#mkdir /var/lib/mysql  #建立新的

[root@ser51 ~]#innobackupex --user root  --password 123456 --databases="mysql performance_schema sys db66" --copy-back  /allback/2018-01-22_21-19-33   

#恢復數據

[root@ser51 ~]#ls -ld /var/lib/mysql  #查看目錄的屬性

[root@ser51 ~]#chown -R mysql:mysql /var/lib/mysql

#更改成全部者,屬組爲mysql

[root@ser51 ~]#systemctl restart mysqld   #重啓服務

[root@ser51 ~]#mysql -uroot -p123456     #進入查看是否恢復成功

 

若是服務沒有成功?

mv /etc/my.cnf  /etc/my.cnf.back

mysql_install_db --user=mysql --datadir=/var/lib/mysql

2.3 innobackupex增量備份

(1) 條件

必須有一次徹底備份,本例以備份到/onedir爲例

第一次增量備份到/new1dir中

第二次增量備份到/new2dir中

(2)增量備份

第一步:徹底備份

[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" /onedir  --no-timestamp

第二步:改變db66數據庫表中的數據

進行第一次的增量備份到/new1dir

[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental  /new1dir  --incremental-basedir=/onedir --no-timestamp

#增量備份時,指定上一次備份數據存儲的目錄名

第三步:再次改變db66數據庫表中的數據

進行第二次的增量備份到/new2dir

[root@ser51 ~]#innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --incremental  /new2dir  --incremental-basedir=/new1dir --no-timestamp

第四步:數據恢復

[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"

--apply-log  --redo-only  /onedir   #恢復徹底備份日誌

[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"

--apply-log  --redo-only  /onedir/  --incremental-dir=/new1dir

#恢復增量日誌

[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66"

--apply-log  --redo-only  /onedir/  --incremental-dir=/new2dir

#恢復增量日誌

[root@ser51 ~]# innobackupex --user root --password 123456 --databases="mysql performance_schema sys db66" --copy-back /onedir  #恢復文件

[root@ser51 ~]# chown -R mysql:mysql /var/lib/mysql/

[root@ser51 ~]# systemctl restart mysqld

登陸數據庫查看數據是否恢復

2.4 增量備份原理:

在/var/lib/mysql/下存在事務日誌ib_logfile0 和ib_logfile1  ibdata1

備份以後同步日誌會在新的備份的文件內存在如下兩個文件:

xtrabackup_checkpoints #存在lsn:日誌序列號

xtrabackup_logfile  #日誌文件

每一次的增量恢復日誌時,會和徹底備份的日誌進行合併,而且日誌序列號會發生變化,這個變化記錄了合併的序列號位置,同時會把增量備份的數據合併到徹底備份中。

[root@ser51 ~]# cat /onedir/xtrabackup_checkpoints

[root@ser51 ~]# cat /new1dir/xtrabackup_checkpoints

[root@ser51 ~]# cat /new2dir/xtrabackup_checkpoints

2.5恢復徹底備份數據中的某張表

(1)刪除表空間命令

mysql> alter  table 庫.表  discard  tablespace;

(2)前提徹底備份的數據庫:

#innobackupex --user root --password 123456  --databases="db66"   /db66bak   --no-timestamp

#ls /db66bak

(3)mysql> use db66;

mysql> drop  table  a;  #刪除表a,對錶a操做恢復的過程

mysql> create  table a(id int); # 建空表,表字段信息必須和原來一致

#ls /var/lib/mysql/db66/

a.frm  a.ibd

(4)導出表信息

#innobackupex --user root --password 123456

--databases="db66" --apply-log --export /db66bak  

#ls /db66bak/db66/ #查看發生了什麼變化

(5)刪除表空間

mysql> alter  table db66.a  discard  tablespace;  

#ls /var/lib/mysql/db66/

(6)把備份目錄下導出的表信息文件拷貝到數據庫目錄下

# cp /db66bak/db66/a.{cfg,exp,ibd}  /var/lib/mysql/db66/

(7)修改文件全部者

# chown  mysql /var/lib/mysql/db66/a.*

(8)導入表空間

mysql> alter  table  db66.a  import  tablespace;

mysql> select  * from  a;

mysql> select  * from  b;

相關文章
相關標籤/搜索