mysql1

分別基於mysqldump、lvm2、xtrabackup三種方式實現MySQL備份恢復

一、利用mysqldump實施邏輯備份操作

1.在/etc/my.cnf中添加如下,開啓二進制日誌

innodb-file-per-table = ON

skip-name-resolve=ON

log_bin=/var/log/maradb/binlog

2.備份數據,鎖表,二進制日誌做滾動,CHANGE MASTER TO設置爲2讓語句被註釋

[root@zj07 ~]# mysqldump -uroot -hlocalhost zrs --lock-tables --flush-logs --master-data=2 > /tmp/zrs.1.sql

查看日誌存放位置,出現2,即日誌發生滾動

[root@zj07 ~]# ls /var/log/mariadb

binlog.000001 binlog.000002 binlog.index mariadb.log

添加數據庫結構,即顯示數據庫的創建和使用 --databases

[root@zj07 ~]# mysqldump -uroot -hlocalhost --databases zrs --lock-tables --flush-logs --master-data=2 > /tmp/zrs.2.sql

備份整個服務器的數據庫 --all-databases

[root@zj07 ~]# mysqldump -uroot -hlocalhost --all-databases --lock-tables --flush-logs --master-data=2 > /tmp/myserver.1.sql

3.模擬故障

進程崩潰

[root@zj07 ~]# killall mysqld mysqld_safe

所有的庫文件丟失

[root@zj07 ~]# rm -rf /var/lib/mysql/*

4.恢復備份

先啓動服務

[root@zj07 ~]# systemctl start mariadb

查看已經生成修復的庫文件

[root@zj07 ~]# ls /var/lib/mysql/

aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test

aria_log_control ib_logfile0 mysql performance_schema

因爲恢復的過程,也會產生命令記錄,導致數據改變,所以強制不讓其記錄到二進制

[root@zj07 ~]# mysql

僅設置當前會話即可

MariaDB [(none)]> set @@session.sql_log_bin=OFF;

恢復數據

MariaDB [(none)]> source /tmp/myserver.1.sql

再開啓二進制記錄

MariaDB [zrs]> set @@session.sql_log_bin=ON;

5.當恢復數據後,需要刪除備份,再重新備份,備份數據僅使用一次。


二、利用lvm2實現物理備份操作

溫備份(幾乎熱備)

1.先創建一個分區

[root@zj07 ~]# fdisk /dev/sda

命令(輸入 m 獲取幫助):n

Partition type:

p primary (2 primary, 0 extended, 2 free)

e extended

Select (default p):

Using default response p

分區號 (3,4,默認 3):

起始 扇區 (109684736-167772159,默認爲 109684736):

將使用默認值 109684736

Last 扇區, +扇區 or +size{K,M,G} (109684736-167772159,默認爲 167772159):+20G

分區 3 已設置爲 Linux 類型,大小設爲 20 GiB

命令(輸入 m 獲取幫助):t

分區號 (1-3,默認 3):3

Hex 代碼(輸入 L 列出所有代碼):8e

已將分區“Linux”的類型更改爲“Linux LVM”

命令(輸入 m 獲取幫助):w

partprobe一下

[root@zj07 ~]# partprobe /dev/sda

查看剛纔創建的分區是否存在

[root@zj07 ~]# cat /proc/partitions

做物理卷

[root@zj07 ~]# pvcreate /dev/sda3

Physical volume "/dev/sda3" successfully created.

做卷組

[root@zj07 ~]# vgcreate datavg /dev/sda3

Volume group "datavg" successfully created

創建邏輯卷,指定名字

[root@zj07 ~]# lvcreate -L 8G -n mydata datavg

Logical volume "mydata" created.

查看

[root@zj07 ~]# lvs

LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert

root centos -wi-ao---- 50.00g

swap centos -wi-ao---- 2.00g

mydata datavg -wi-a----- 8.00g

[root@zj07 ~]# ls /dev/mapper/

centos-root centos-swap control datavg-mydata

[root@zj07 ~]# ls /dev/datavg/

mydata

格式化

[root@zj07 ~]# mke2fs -b 2048 -t ext4 /dev/datavg/mydata

[root@zj07 ~]# blkid /dev/datavg/mydata

/dev/datavg/mydata: UUID="95e9edc9-257a-49c6-b44b-235f18af371d" TYPE="ext4"

創建目錄

[root@zj07 ~]# mkdir -pv /data/mydata

掛載這個lvm到創建的目錄下,在配置文件中,添加如下

[root@zj07 ~]# vim /etc/fstab

UUID="95e9edc9-257a-49c6-b44b-235f18af371d" /data/mydata ext4 defaults,acl 0 0

查看

[root@zj07 ~]# mount -a

[root@zj07 ~]# df

文件系統 1K-塊 已用 可用 已用% 掛載點

/dev/mapper/centos-root 52403200 4552636 47850564 9% /

...

...

...

/dev/mapper/datavg-mydata 8190760 12308 7750830 1% /data/mydata

更改該目錄的屬主屬組

[root@zj07 ~]# chown -R mysql.mysql /data/*

修改配置文件

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

[mysqld]

datadir=/data/mydata

socket=/data/mydata/mysql.sock

2.模擬故障

進程崩潰

[root@zj07 ~]# killall mysqld mysqld_safe

所有的庫文件丟失

[root@zj07 ~]# rm -rf /var/lib/mysql/*

3.恢復備份

先啓動服務

[root@zj07 ~]# systemctl start mariadb

當更改sock文件後,進入mysql會提示錯誤,可以如下設置配置文件,即可。

[root@zj07 ~]# mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

[root@zj07 ~]# vim .my.cnf

[client]

socket='/data/mydata/mysql.sock'

關閉二進制日誌記錄,恢復備份,再開啓二進制日誌記錄。

MariaDB [(none)]> set @@session.sql_log_bin=OFF;

MariaDB [(none)]> source /tmp/myserver.1.sql;

MariaDB [zrs]> set @@session.sql_log_bin=ON;

爲了測試,先創建一個表,插入數據

MariaDB [zrs]> create table if not exists tbl5 (UID tinyint unsigned not null auto_increment primary key,Username varchar(100),Age tinyint unsigned);

MariaDB [zrs]> insert into tbl5 (Username,Age) values ('Zhang san',30),('Li si',27);

給表加一個讀鎖

MariaDB [zrs]> flush tables with read lock;

創建快照卷

[root@zj07 ~]# lvcreate -L 5G -s -p r -n data_backup /dev/datavg/mydata

Using default stripesize 64.00 KiB.

Logical volume "data_backup" created.

立馬釋放鎖

MariaDB [zrs]> unlock tables;

創建目錄

[root@zj07 ~]# mkdir -pv /mnt/backup

掛載

[root@zj07 ~]# mount /dev/datavg/data_backup /mnt/backup

查看

[root@zj07 ~]# ls /mnt/backup/

aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test

aria_log_control ib_logfile0 mysql performance_schema zrs

創建備份目錄

[root@zj07 ~]# mkdir /tmp/backup

將文件全部備份到該目錄

[root@zj07 ~]# cd /mnt/backup

[root@zj07 backup]# cp -a * /tmp/backup/

刪除不需要的文件

[root@zj07 backup]# rm -f /tmp/backup/mysql.sock

記錄下面的二進制數值,以備之後恢復數據

MariaDB [zrs]> show master status;

+---------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+---------------+----------+--------------+------------------+

| binlog.000012 | 759 | | |

+---------------+----------+--------------+------------------+

4.模擬故障

[root@zj07 ~]# killall mysqld mysqld_safe

掛載並刪除快照卷

[root@zj07 ~]# umount /mnt/backup/

[root@zj07 ~]# lvremove /data/datavg/data_backup

刪除目錄下的文件

[root@zj07 ~]# rm -rf /data/mydata/*

5.下面開始進行物理備份還原

[root@zj07 ~]# cd /tmp/backup/

[root@zj07 backup]# cp -a * /data/mydata/

啓動服務

[root@zj07 backup]# systemctl start mariadb

[root@zj07 backup]# mysql

MariaDB [(none)]> use zrs;

MariaDB [zrs]> select * from tbl5;

+-----+-----------+------+

| UID | Username | Age |

+-----+-----------+------+

| 1 | Zhang san| 30 |

| 2 | Li si | 27 |

+-----+-----------+------+

發現剛纔新建的數據並沒有恢復

利用二進制日誌恢復

[root@zj07 ~]# mysqlbinlog --start-position=759 /var/log/mariadb/binlog.000012 > /tmp/lvm.sql

關閉二進制記錄功能

MariaDB [zrs]> set @@session.sql_log_bin=OFF;

利用二進制日誌恢復數據

MariaDB [zrs]> . /tmp/lvm.sql

開啓二進制記錄功能

MariaDB [zrs]> set @@session.sql_log_bin=ON;


三、利用xtrabackup實現物理備份操作

1.安裝軟件

yum install percona-xtrabackup

2.

創建備份目錄

[root@zj07 ~]# mkdir /data/backup

更改屬組屬主

[root@zj07 ~]# chown mysql. /data/backup/

完全備份

[root@zj07 ~]# innobackupex --user=root --host=localhost --socket=/data/mydata/mysql.sock /data/backup/

查看,以時間命名創建目錄

[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43

爲了做增量備份,先修改表內容,如下

MariaDB [zrs]> insert into tbl5 (username,age) values ('Qi qi',55);

MariaDB [zrs]> delete from tbl5 where UID between 1 and 2;

做增量備份,指明基於哪一次完全備份

[root@zj07 ~]# innobackupex --user=root --socket=/data/mydata/mysql.sock --incremental /data/backup/ --incremental-basedir=/data/backup/2018-01-15_16-48-43

查看,已經生成增量備份

[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43 2018-01-15_17-10-47

如何區分呢,查看該配置文件

[root@zj07 ~]# cat /data/backup/2018-01-15_16-48-43/xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 1611662

last_lsn = 1611662

compact = 0

recover_binlog_info = 0

[root@zj07 ~]# cat /data/backup/2018-01-15_17-10-47/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 1611662

to_lsn = 1613212

last_lsn = 1613212

compact = 0

recover_binlog_info = 0

爲了再次做增量備份,再次修改表內容,如下

MariaDB [zrs]> create table if not exists tbl7 (UID tinyint unsigned not null auto_increment primary key,Username varchar(100),Age tinyint unsigned);

MariaDB [zrs]> insert into tbl7 (Username,Age) values ('name11',98),('name22',99);

基於第二次增量備份,再次做增量

[root@zj07 ~]# innobackupex --user=root --socket=/data/mydata/mysql.sock --incremental /data/backup/ --incremental-basedir=/data/backup/2018-01-15_17-10-47

[root@zj07 ~]# ls /data/backup/

2018-01-15_16-48-43 2018-01-15_17-10-47 2018-01-15_17-38-09

刪除數據

MariaDB [zrs]> delete from tbl7 where UID between 1 and 2;

注意:如果在最後一個備份結果集之後,還有其他的數據修改操作,還需要依靠在最後一次備份操作之後的二進制日誌的內容來實現數據的完整恢復。

3.模擬故障

[root@zj07 ~]# killall mysqld mysqld_safe

[root@zj07 ~]# cd /data

[root@zj07 data]# rm -rf mydata/*

4.恢復數據

準備工作

[root@zj07 ~]# innobackupex --apply-log --redo-only /data/backup/2018-01-15_16-48-43/

[root@zj07 ~]# innobackupex --apply-log --redo-only /data/backup/2018-01-15_16-48-43/ --incremental-dir=/data/backup/2018-01-15_17-10-47

[root@zj07 ~]# innobackupex --apply-log /data/backup/2018-01-15_16-48-43/ --incremental-dir=/data/backup/2018-01-15_17-38-09

恢復工作

[root@zj07 ~]# innobackupex --copy-back /data/backup/2018-01-15_16-48-43/

查看

[root@zj07 ~]# ls /data/mydata/

ibdata1 performance_schema xtrabackup_binlog_pos_innodb zrs

mysql test xtrabackup_info

因爲在第二次增量備份後,又刪除了兩個數據,所以需要藉助binlog恢復

[root@zj07 ~]# cat /data/backup/2018-01-15_17-38-09/xtrabackup_binlog_info

binlog.000013 1123

保存

[root@zj07 ~]# mysqlbinlog --start-position=1123 /var/log/mariadb/binlog.000013 > /tmp/last.sql

修改權限

[root@zj07 ~]# chown mysql. -R /data/mydata/*

重啓服務

[root@zj07 data]# systemctl start mariadb

查看,該表的內容還在

MariaDB [zrs]> select * from tbl7;

+-----+----------+------+

| UID | Username | Age |

+-----+----------+------+

| 1 | name11 | 98 |

| 2 | name22 | 99 |

+-----+----------+------+

關閉二進制日誌記錄功能

MariaDB [zrs]> set @@session.sql_log_bin=OFF;

恢復

MariaDB [zrs]> . /tmp/last.sql

開啓二進制日誌記錄功能

MariaDB [zrs]> set @@session.sql_log_bin=ON;

查看,該表的內容已經沒有了

MariaDB [zrs]> select * from tbl7;

Empty set (0.01 sec)


總結:

MySQL的備份和恢復:

mysqldump:邏輯備份 + 溫備|熱備 + binlog

lvm2:物理備份 + 溫備(幾乎熱備) + binlog

Xtrabackup:物理備份 + 溫備|熱備 + (完全+增量) + binlog

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章