實驗之MySQL日誌備份與恢復

       日誌是mysql數據庫的重要組成部分。日誌文件中記錄着mysql數據庫運行期間發生的變化;也就是說用來記錄mysql數據庫的客戶端鏈接情況、SQL語句的執行狀況和錯誤信息等。當數據庫遭到意外的損壞時,能夠經過日誌查看文件出錯的緣由,而且能夠經過日誌文件進行數據恢復。下面是對MYSQL日誌和數據恢復的簡單介紹。node

1、MySQL日誌mysql

主要包含:錯誤日誌、查詢日誌、慢查詢日誌、事務日誌、二進制日誌linux

二 、MySQL備份工具sql

mysqldump:邏輯備份工具 ,適用於全部引擎,可用於溫備,能實現徹底備份,部分備份數據庫

cp,tar等文件系統工具:物理備份工具,適用於全部存儲引擎,用於冷備,能實現徹底備份、部分備份vim

lvm2的快照:幾乎熱備;藉助文件系統工具實現物理備份centos

mysqlhotcopy:幾乎冷備;僅用於MyISAM存儲引擎app

3、因爲二進制日誌格外重要,因此這裏介紹基於二進制的mysql備份方法工具

方法1、mysqldump + binlog測試

徹底備份,經過備份二進制日誌實現增量備份

命令的語法格式

mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表

mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2DB3...]:備份一個或多個庫

mysqldump [OPTIONS] --all-databases [OPTIONS]:備份全部庫

實驗步驟以下:

①準備備份目錄

[root@centos7 ~]# mkdir /mysqlback  建立備份目錄
[root@centos7 ~]# chown -R mysql.mysql /mysqlback/ 修改權限

②準備備份數據庫及表

[root@centos7 ~]# mysql -uroot -p   登陸數據庫
MariaDB [(none)]> create database magedu;   建立數據庫
MariaDB [(none)]>use magedu;
MariaDB [magedu]> create table m26(id int not null.name char (20));  建立數據表

③進行完整備份

[root@centos7 /mysqlback]# mysqldump --database magedu --flush-log > /mysqlback/mysql-all-back-`date +%F-%T`.sql  完整數據庫備份
[root@centos7 /mysqlback]# mysqldump --database magedu --flush-log > /mysqlback/mysql-magedu-back-`date +%F-%T`.sql  單個數據庫備份,備份magedu數據庫 
[root@centos7 /mysqlback]# ls
mysql-all-back-2017-11-16-14:47:03.sql  mysql-magedu-back-2017-11-16-14:48:44.sql

④向表中插入數據

MariaDB [(none)]> use magedu;
Database changed
MariaDB [magedu]> insert into m26 values(004,'xiaohong');
Query OK, 1 row affected (0.01 sec)
MariaDB [magedu]> insert into m26 values(005,'xiaolan'); 
Query OK, 1 row affected (0.00 sec)
MariaDB [magedu]> select * from m26;
+----+----------+
| id | name |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 4 | xiaohong |
| 5 | xiaolan |
+----+----------+

⑤進行增量備份,備份二進制日誌

[root@centos7 /var/lib/mysql]# mysqlbinlog bin-log.000007  查看position(BEGIN418 COMMIT644)
[root@centos7 /var/lib/mysql]# mysqlbinlog --start-position=418 --stop-position=644 /var/lib/mysql/bin-log.000007 > /mysqlback/bin-log-`date +%F_%T`.sql  根據上面查到的position位置進行增量備份

⑥繼續向數據庫中插入數據,沒備份直接刪除數據庫

MariaDB [(none)]> use magedu;
Database changed
MariaDB [magedu]> insert into m26 values(008,'liuyifei');
Query OK, 1 row affected (0.03 sec)
MariaDB [magedu]> drop database magedu;

⑦數據恢復,首先保護好最後的二進制日誌,查看刪除數據庫以前的position值

BEGIN
/*!*/;
# at 714
#171116 15:07:56 server id 1 end_log_pos 817 Query thread_id=11 exec_time=0 error_code=0
SET TIMESTAMP=1510816076/*!*/;
insert into m26 values(008,'liuyifei')
/*!*/;
# at 817
#171116 15:07:56 server id 1 end_log_pos 844 Xid = 439
COMMIT/*!*/;
# at 844
#171116 15:08:16 server id 1 end_log_pos 929 Query thread_id=11 exec_time=0 error_code=0
SET TIMESTAMP=1510816096/*!*/;
drop database magedu

⑧將最後操做的二進制日誌備份

[root@centos7 /var/lib/mysql]# mysqlbinlog --stop-position=817 /var/lib/mysql/bin-log.000007 > /mysqlback/bin-log-`date +%F-%T`.sql

⑨導入以前的全部備份

[root@centos7 /var/lib/mysql]# cd /mysqlback/
[root@centos7 /mysqlback]# ls
bin-log-2017-11-16_15:02:49.sql mysql-all-back-2017-11-16-14:47:03.sql
bin-log-2017-11-16-15:16:41.sql mysql-magedu-back-2017-11-16-14:48:44.sql
bin-log-.sql
[root@centos7 /mysqlback]# mysql -uroot -p < mysql-all-back-2017-11-16-14:47:03.sql
[root@centos7 /mysqlback]# mysql -uroot -p < mysql-magedu-back-2017-11-16-14:48:44.sql
[root@centos7 /mysqlback]# mysql -uroot -p < bin-log-2017-11-16_15\:02\:49.sql 
[root@centos7 /mysqlback]# mysql -uroot -p < bin-log-2017-11-16-15:16:41.sql

⑩查看數據庫及數據(恢復成功)

[root@centos7 /mysqlback]# mysql -uroot -p
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| magedu |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]> use magedu;
Database changed
MariaDB [magedu]> select * from m26;
+----+----------+
| id | name |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 5 | xiaolan |
| 4 | xiaohong |
| 6 | liuyifei |
+----+----------+
6 rows in set (0.00 sec)

方法二、lbm2快照+binlog

LVM快照簡單來講就是將所快照源分區一個時間點全部文件的元數據(記錄數據屬性的數據)進行保存,若是源文件沒有改變,那麼訪問快照卷的相應文件則直接指向源分區的源文件,若是源文件發生改變,則快照卷中與之對應的文件不會發生改變。快照卷主要用於輔助備份文件。

實驗步驟以下:

①添加一塊硬盤

②並劃分磁盤類型爲lvm類型

[root@centos7 ~]# echo '- - -' >/sys/class/scsi_host/host0/s  使主機識別硬盤
[root@centos7 ~]# fdisk -l  查看是否添加成功
Disk /dev/sde: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
分區
[root@centos7 ~]# fdisk /dev/sde  對磁盤進行分區
Welcome to fdisk (util-linux 2.23.2).

③對此磁盤的操做以下

[root@centos7 ~]# partprobe  重讀分區表
[root@centos7 ~]# fdisk -l   查看
Device Boot Start End Blocks Id System
/dev/sde1 2048 209715199 104856576 8e Linux LVM 
[root@centos7 ~]# pvcreate /dev/sde1  初始化物理卷
Physical volume "/dev/sde1" successfully created.
[root@centos7 ~]# vgcreate myvg /dev/sde1
Volume group "myvg" successfully created
[root@centos7 ~]# lvcreate -n mydata -L 50G myvg  建立LVM卷組
Logical volume "mydata" created.
[root@centos7 ~]# mkfs.ext4 /dev/mapper/myvg-mydata 格式化分區
mke2fs 1.42.9 (28-Dec-2013
Allocating group tables: done 
Writing inode tables: done 
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 
[root@centos7 ~]# mkdir /bak   建立一個掛載目錄
[root@centos7 ~]# mount /dev/mapper/myvg-mydata /bak   掛載
[root@centos7 ~]# cd /bak
[root@centos7 /bak]# ls
lost+found

④對數據庫的操做以下

[root@centos7 /bak]# systemctl stop mariadb
[root@centos7 /bak]# cd /var/lo
local/ lock/ log/ 
[root@centos7 /bak]# cd /var/lib/mysql/
[root@centos7 /var/lib/mysql]# mv * /bak
[root@centos7 /var/lib/mysql]# cd /bak
[root@centos7 /bak]# ls
aria_log.00000001 bin-log.000004 ibdata1 magedu.sql mysql-bin.000004
aria_log_control bin-log.000005 ib_logfile0 mysql mysql-bin.000005
bin-log.000001 bin-log.000006 ib_logfile1 mysql-bin.000001 mysql-bin.index
bin-log.000002 bin-log.000007 lost+found mysql-bin.000002 performance_schema
bin-log.000003 bin-log.index magedu mysql-bin.000003 test
[root@centos7 /bak]# chown mysql.mysql . -R

⑤整理

[root@centos7 /bak]# vim /etc/my.cnf
datadir=/bak  使得數據文件在邏輯捲上
[root@centos7 /bak]# systemctl start mariadb
[root@centos7 /bak]# mysql -uroot -p
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;  鎖定表
Query OK, 0 rows affected (0.00 sec)
[root@centos7 /bak]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata  建立快照卷
Using default stripesize 64.00 KiB.
Logical volume "mydata-snap" created.
[root@centos7 /bak]# mysql -uroot -p
MariaDB [(none)]> UNLOCK TABLES;  解鎖全部表
Query OK, 0 rows affected (0.00 sec)
[root@centos7 /bak]# mkdir /snap
[root@centos7 /bak]# mount /dev/mapper/myvg-mydata /snap  掛載快照卷
[root@centos7 /bak]# cd /snap/
[root@centos7 /snap]# ls (這裏是存儲的元數據,真實的數據存儲在/bak下)
aria_log.00000001 bin-log.000004 bin-log.index magedu mysql-bin.000003 test
aria_log_control bin-log.000005 ibdata1 magedu.sql mysql-bin.000004
bin-log.000001 bin-log.000006 ib_logfile0 mysql mysql-bin.000005
bin-log.000002 bin-log.000007 ib_logfile1 mysql-bin.000001 mysql-bin.index
bin-log.000003 bin-log.000008 lost+found mysql-bin.000002 performance_schema

⑥打包備份並刪庫

[root@centos7 /snap]# tar -cjvf mysql-backup.tar.gz ./*  打包物理備份
[root@centos7 /snap]# cd /bak
[root@centos7 /bak]# mv mysql-backup.tar.gz /root
[root@centos7 /bak]# rm -rf * (刪除bak下的數據,snap裏也沒有了)
[root@centos7 /bak]# ls
[root@centos7 /bak]# cd /snap/
[root@centos7 /snap]# ls
[root@centos7 /snap]# cd /bak
[root@centos7 /bak]# mv /root/mysql-backup.tar.gz ./
[root@centos7 /bak]# ls
mysql-backup.tar.gz
[root@centos7 /bak]# tar -xvf mysql-backup.tar.gz
[root@centos7 /bak]# ls (bak和snap裏的數據都恢復了)
aria_log.00000001 bin-log.000005 ib_logfile0 mysql-backup.tar.gz mysql-bin.index
aria_log_control bin-log.000006 ib_logfile1 mysql-bin.000001 performance_schema
bin-log.000001 bin-log.000007 lost+found mysql-bin.000002 test
bin-log.000002 bin-log.000008 magedu mysql-bin.000003
bin-log.000003 bin-log.index magedu.sql mysql-bin.000004
bin-log.000004 ibdata1 mysql mysql-bin.000005
[root@centos7 /bak]# cd /snap/
[root@centos7 /snap]# ls
aria_log.00000001 bin-log.000005 ib_logfile0 mysql-backup.tar.gz mysql-bin.index
aria_log_control bin-log.000006 ib_logfile1 mysql-bin.000001 performance_schema
bin-log.000001 bin-log.000007 lost+found mysql-bin.000002 test
bin-log.000002 bin-log.000008 magedu mysql-bin.000003
bin-log.000003 bin-log.index magedu.sql mysql-bin.000004
bin-log.000004 ibdata1 mysql mysql-bin.000005

⑦測試

[root@centos7 /snap]# systemctl start mariadb
[root@centos7 /snap]# mysql -uroot -p (數據庫都回來了)
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.52-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use magedu;
Database changed
MariaDB [magedu]> select * from m26;
+----+----------+
| id | name |
+----+----------+
| 1 | one |
| 2 | two |
| 3 | three |
| 5 | xiaolan |
| 4 | xiaohong |
| 5 | xiaolan |
| 9 | aodaili |
+----+----------+
7 rows in set (0.07 sec)

 總結:數據無價,學好備份與恢復很重要!!

相關文章
相關標籤/搜索