乐趣区

关于mysql:逻辑备份mysqldump-vs物理备份XtraBackup

逻辑备份:mysqldump

mysqldump 是 MySQL 官网提供的一款逻辑备份的工具,其备份原理是生成一组能够导入数据库中以重现原始数据库中的数据和数据库对象的 SQL 语句,而后用 SQL 语句对数据库进行复原,因而称它为逻辑备份,另外它还反对生成 CSV 格局或者 XML 格局的文件。

应用 mysqldump 进行备份时是须要肯定的权限的,备份表数据须要对表的 SELECT 权限,导出视图须要 SHOW VIEW 权限,导出触发器须要 TRIGGER 权限,在不应用 –single-transaction 选项进行锁表时须要 LOCK TABLES 权限。如果应用更多的选项,可能就须要有更多的权限。

另外,如果咱们须要用备份文件进行复原时,则必须具备执行这个文件中所有语句的权限,例如执行 CREATE 语句就须要有相应对象的 CREATE 权限,执行 LOCK TABLES 语句时须要有 LOCK TABLES 权限。

上面咱们演示一下 mysqldump 的用法。

mysqldump 是 MySQL 的原生命令,个别咱们装置完 MySQL 后,mysqldump 命令就能够间接应用了。

[root@dk-14 ~]# mysqldump –version

mysqldump  Ver 10.13 Distrib 5.7.21, for linux-glibc2.12 (x86_64)

首先进行一下全库备份的演示,首先咱们在将要备份的库上制作一些测试数据。

mysql> SHOW DATABASES;

| Database           |

| information_schema |

| mysql              |

| performance_schema |

| sys                |

4 rows in set (0.00 sec)

mysql> CREATE DATABASE aa;

Query OK, 1 row affected (0.04 sec)

mysql> USE aa

Database changed

mysql> CREATE TABLE t1(id INT PRIMARY KEY,name VARCHAR(20));

Query OK, 0 rows affected (0.12 sec)

mysql> CREATE TABLE t2(id INT PRIMARY KEY,name VARCHAR(20));

Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO t1 VALUES(1,’aa’),(2,’bb’),(3,’cc’), (4,’dd’),(5,’ee’);

Query OK, 5 rows affected (0.11 sec)

Records: 5  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t2 VALUES(1,’aaa’),(2,’bbb’),(3,’ccc’),

 (4,’ddd’),(5,’eee’);

Query OK, 5 rows affected (0.00 sec)

Records: 5  Duplicates: 0  Warnings: 0

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  1 | aaa  |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

5 rows in set (0.00 sec)

此时,咱们对数据库发动全库备份。

[root@dk-14 ~]# mkdir backup

[root@dk-14 ~]# cd backup/

[root@dk-14 backup]# mysqldump -uroot -p12345678 -S /tmp/mysql-3306.sock –single-transaction –set-gtid-purged=OFF –all-databases > all_back.sql

mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@dk-14 backup]# ls

all_back.sql

–single-transaction:此选项会对 InnoDB 表开启一个一致性快照,备份 InnoDB 表时不会锁表,对其余引擎的表有效。

–set-gtid-purged=OFF:在开启 GTID 的状况下,此选项会决定是否会在备份文件头部增加 set global gtid_purged 的语句,ON 为增加,OFF 为不增加,个别备份用于搭建从库的时候会设为 ON。

备份实现后,会生成一个备份文件,咱们能够查看一下备份文件的内容。

[root@dk-14 backup]# head -50 all_back.sql

— MySQL dump 10.13  Distrib 5.7.21, for linux-glibc2.12 (x86_64)

— Host: localhost    Database:


— Server version  5.7.21-log

/!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;

/!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;

/!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;

/!40101 SET NAMES utf8 /;

/!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;

/!40103 SET TIME_ZONE=’+00:00′ /;

/!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;

/!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;

/!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=’NO_AUTO_VALUE_ON_ZERO’ /;

/!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 /;

— Current Database: aa

CREATE DATABASE /!32312 IF NOT EXISTS/ aa /!40100 DEFAULT CHARACTER SET latin1 /;

USE aa;

— Table structure for table t1

DROP TABLE IF EXISTS t1;

/!40101 SET @saved_cs_client     = @@character_set_client /;

/!40101 SET character_set_client = utf8 /;

CREATE TABLE t1 (

  id int(11) NOT NULL,

  name varchar(20) DEFAULT NULL,

  PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/!40101 SET character_set_client = @saved_cs_client /;

— Dumping data for table t1

LOCK TABLES t1 WRITE;

/!40000 ALTER TABLE t1 DISABLE KEYS /;

INSERT INTO t1 VALUES (1,’aa’),(2,’bb’),(3,’cc’),(4,’dd’),(5,’ee’);

/!40000 ALTER TABLE t1 ENABLE KEYS /;

UNLOCK TABLES;

通过备份文件的内容,能够看到,文件外面存储的是整个库重建和从新插入数据的 SQL 语句,逻辑备份就是通过这种形式实现的。

上面咱们制作一下数据失落的场景,而后测试一下利用备份文件进行复原。

mysql> USE aa

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.02 sec)

mysql> SELECT * FROM t2;

| id | name |

|  1 | aaa  |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

5 rows in set (0.00 sec)

mysql> DELETE FROM t1 WHERE id=1;

Query OK, 1 row affected (0.04 sec)

mysql> DELETE FROM t2 WHERE id=1;

Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM t1;

| id | name |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

4 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.01 sec)

别离在 t1 和 t2 表中删除 id 为 1 的数据,而后利用备份文件进行复原。

[root@dk-14 backup]# mysql -uroot -p12345678 -S /tmp/mysql-3306.sock < all_back.sql

验证数据是否复原为咱们备份时的内容。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  1 | aaa  |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

5 rows in set (0.00 sec)

从上述后果来看,咱们删除的数据曾经通过备份复原了进去。

逻辑备份还能够用于指定表或指定库的备份复原,上面咱们做一个演示,首先对 t1 表进行备份。

[root@dk-14 backup]# mysqldump -uroot -p12345678 -S /tmp/mysql-3306.sock –single-transaction –set-gtid-purged=OFF aa t1 > t1.sql

mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@dk-14 backup]# ls

all_back.sql  t1.sql

查看一下备份文件的内容。

[root@dk-14 backup]# cat t1.sql

— MySQL dump 10.13  Distrib 5.7.21, for linux-glibc2.12 (x86_64)

— Host: localhost    Database: aa


— Server version  5.7.21-log

/!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;

/!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;

/!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;

/!40101 SET NAMES utf8 /;

/!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;

/!40103 SET TIME_ZONE=’+00:00′ /;

/!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;

/!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;

/!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=’NO_AUTO_VALUE_ON_ZERO’ /;

/!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 /;

— Table structure for table t1

DROP TABLE IF EXISTS t1;

/!40101 SET @saved_cs_client     = @@character_set_client /;

/!40101 SET character_set_client = utf8 /;

CREATE TABLE t1 (

  id int(11) NOT NULL,

  name varchar(20) DEFAULT NULL,

  PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

/!40101 SET character_set_client = @saved_cs_client /;

— Dumping data for table t1

LOCK TABLES t1 WRITE;

/!40000 ALTER TABLE t1 DISABLE KEYS /;

INSERT INTO t1 VALUES (1,’aa’),(2,’bb’),(3,’cc’),(4,’dd’),(5,’ee’);

/!40000 ALTER TABLE t1 ENABLE KEYS /;

UNLOCK TABLES;

/!40103 SET TIME_ZONE=@OLD_TIME_ZONE /;

/!40101 SET SQL_MODE=@OLD_SQL_MODE /;

/!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /;

/!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /;

/!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /;

/!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /;

/!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /;

/!40111 SET SQL_NOTES=@OLD_SQL_NOTES /;

— Dump completed on 2020-02-04  2:42:23

能够看到,备份文件中是重建 t1 表和从新往 t1 表插入数据的 SQL。

而后咱们手动删除一些数据。

mysql> USE aa

Database changed

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  1 | aaa  |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

5 rows in set (0.00 sec)

mysql> DELETE FROM t1 WHERE id=1;

Query OK, 1 row affected (0.01 sec)

mysql> DELETE FROM t2 WHERE id=1;

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

4 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.00 sec)

利用 t1 表的备份文件进行一次数据恢复。

[root@dk-14 backup]# mysql -uroot -p12345678 -S /tmp/mysql-3306.sock aa < t1.sql

咱们到库中查看一下复原状况。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.01 sec)

能够看到 t1 表的数据曾经失常复原进去,t2 表的数据并没有复原,合乎咱们只对 t1 表进行备份复原的预期。

物理备份:XtraBackup

XtraBackup 是 Pecona 公司的一款开源收费的 MySQL 备份软件,是目前最风行的 MySQL 备份软件之一,能够非阻塞的对 InnoDB 和 XtraDB 数据库进行备份。其备份原理是通过备份数据库的物理文件,最初通过利用 redo 日志来让数据放弃同一时间点,因为操作的是物理文件,所以称之为物理备份。

XtraBackup 至多须要 PROCESS,RELOAD,LOCK TABLES,REPLICATION CLIENT 几个权限,PROCESS 用于查看 MySQL 相干连贯的过程,RELOAD 和 LOCK TABLES 用于执行 FLUSH TABLES WITH READ LOCK、FLUSH ENGINE LOGS,REPLICATION CLIENT 用于查看二进制日志以后写到了哪个地位。

上面咱们演示一下 XtraBackup 的用法

首先,咱们到 percona 的官网下载 XtraBack 的安装包,下载地址如下。

Download Percona XtraBackup 2.4

咱们抉择 2.4.4 版本的进行演示。

首先将下载好的 XtraBackup 安装包进行装置。

[root@dk-14 tool]# tar -xf xtrabackup-2.4.4.tar.gz

[root@dk-14 tool]# mv xtrabackup244/ /usr/local/xtrabackup

[root@dk-14 tool]# ln -s /usr/local/xtrabackup/bin/innobackupex /usr/local/bin/

[root@dk-14 tool]# innobackupex –version

innobackupex version 2.4.4 Linux (x86_64) (revision id: df58cf2)

装置好 XtraBackup 后,咱们对数据库做一次备份,数据就应用 mysqldump 篇遗留的数据,备份命令如下。

[root@dk-14 ~]# innobackupex –user=root –password=12345678 –socket=/tmp/mysql-3306.sock /root/backup/

当备份胜利后,屏幕上会打印出 completed OK 的字样,如下所示

200205 08:56:07 [00] Copying ib_buffer_pool to /root/backup/2020-02-05_08-56-05/ib_buffer_pool

200205 08:56:07 [00]        …done

200205 08:56:07 Backup created in directory ‘/root/backup/2020-02-05_08-56-05’

MySQL binlog position: filename ‘mysql-bin.000002’, position ‘777218’, GTID of the last change ‘ac3ef50f-17fd-11ea-9f95-0242ac12000e:1-170’

200205 08:56:07 [00] Writing backup-my.cnf

200205 08:56:07 [00]        …done

200205 08:56:07 [00] Writing xtrabackup_info

200205 08:56:07 [00]        …done

xtrabackup: Transaction log of lsn (3845814) to (3845823) was copied.

200205 08:56:07 completed OK!

去 /root/backup 目录下查看备份生成的文件

[root@dk-14 ~]# ls backup/

2020-02-05_08-56-05

[root@dk-14 ~]# cd backup/2020-02-05_08-56-05/

[root@dk-14 2020-02-05_08-56-05]# ls

aa              ibdata1             sys      undo003                 xtrabackup_info

backup-my.cnf   mysql               undo001  xtrabackup_binlog_info  xtrabackup_logfile

ib_buffer_pool  performance_schema  undo002  xtrabackup_checkpoints

能够看到 backup 目录下有一个工夫戳命名的文件夹,这个就是 XtraBackup 生成的寄存备份文件的目录,如果咱们不想要工夫戳命名的文件夹,能够应用 –no-timestamp 参数,而后自定义目录名称就能够了,例如咱们想将备份文件存储为 all_backup,备份时能够执行上面所示的命令。

[root@dk-14 ~]# innobackupex –user=root –password=12345678

–socket=/tmp/mysql-3306.sock -no-timestamp /root/backup/all_backup

进入到寄存备份文件的目录,能够看到 XtraBackup 实际上就是将数据库的物理文件 copy 了一份,包含 undo 信息以及备份期间生成的 redo 文件 (xtrabackup_logfile),用来对备份期间进入的事务进行前滚,使数据库内的数据放弃同一时间点。

另外还有 xtrabackup_info、xtrabackup_binlog_info、xtrabackup_checkpoints 等几个 XtraBackup 生成的文件,用于记录数据库的 binlog 地位以及检查点等信息,可用于搭建从库。

上面咱们再数据库外面删除一些数据,而后利用备份复原一下。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.01 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.00 sec)

mysql> DELETE FROM t1 WHERE id=5;

Query OK, 1 row affected (0.03 sec)

mysql> DELETE FROM t2 WHERE id=5;

Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

4 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

3 rows in set (0.00 sec)

删除 t1、t2 表 id 为 5 的数据后,咱们利用备份进行复原一下。

首先对备份集进行 apply log,这个操作的目标就是利用 xtrabackup_logfile 文件,对备份期间进入的事务进行前滚,使数据库内的数据放弃同一时间点。

[root@dk-14 3306]# innobackupex –apply-log /root/backup/2020-02-05_08-56-05/

apply log 实现后,咱们将失落数据的数据库清掉,并移走数据文件, 创立新的数据目录。

[root@dk-14 3306]# mysqladmin -uroot -p12345678 -S /tmp/mysql-3306.sock shutdown

[root@dk-14 3306]# cd /dbase/

[root@dk-14 dbase]# mv 3306 3306bak

[root@dk-14 dbase]# mkdir 3306

[root@dk-14 dbase]# cd 3306/

[root@dk-14 3306]# mkdir binlog  data  logs  redo  relaylog  tmp  undo

[root@dk-14 3306]# chown -R mysql:mysql *

执行复原命令。

[root@dk-14 3306]# innobackupex –defaults-file=/etc/mysql/my-3306.cnf –copy-back /root/backup/2020-02-05_08-56-05/

复原分为 move-back 和 copy-back 两种,move back 是将数据文件挪动到数据目录,copy back 是将数据文件拷贝到数据目录,下面应用的是 copy back。

复原实现后,批改一下数据文件的权限,将数据库启动起来。

[root@dk-14 3306]# touch logs/err.log

[root@dk-14 3306]# chown -R mysql:mysql *

[root@dk-14 3306]# mysqld_safe –defaults-file=/etc/mysql/my-3306.cnf –user=mysql &

验证一下数据是否复原。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.00 sec)

能够看到数据曾经复原到咱们删除数据之前的样子。

下面讲述的是 XtraBackup 全量备份的过程,然而生产中会存在一些数据量比拟大的数据库,如果常常进行全量备份会给数据库带来额定的压力,为了加重这种状况,咱们能够应用 XtraBackup 的增量备份的性能。

增量备份也叫差别备份,就是在全量备份的根底上,将发动增量备份时刻和上次备份时产生扭转的数据备份起来,和全量备份组成一份最新的数据。

上面咱们演示一下增量备份的过程。

首先咱们对数据库做一次全量备份。

[root@dk-14 3306]# innobackupex –user=root –password=12345678

–socket=/tmp/mysql-3306.sock –no-timestamp /root/backup/all_backup

而后咱们往数据库外面插入一些数据,模仿增量数据。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

5 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

4 rows in set (0.01 sec)

mysql> INSERT INTO t1 VALUES(6,’ff’),(7,’gg’);

Query OK, 2 rows affected (0.05 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t2 VALUES (6,’ff’),(7,’gg’);

Query OK, 2 rows affected (0.00 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

|  6 | ff   |

|  7 | gg   |

7 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

|  6 | ff   |

|  7 | gg   |

6 rows in set (0.00 sec)

插入增量数据后,咱们在 all_backup 的根底上对数据库发动增量备份。

[root@dk-14 3306]# innobackupex –user=root –password=12345678 –socket=/tmp/mysql-3306.sock –incremental-basedir=/root/backup/all_backup –incremental –no-timestamp /root/backup/inc_backup_1

而后再进行一次增量数据的模仿。

mysql> INSERT INTO t1 VALUES (8,’hh’),(9,’ii’);

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO t2 VALUES (8,’hh’),(9,’ii’);

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

|  9 | ii   |

9 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

|  9 | ii   |

8 rows in set (0.00 sec)

而后再在增量备份 inc_backup_1 的根底上再做一次增量。

[root@dk-14 3306]# innobackupex –user=root –password=12345678 –socket=/tmp/mysql-3306.sock –incremental-basedir=/root/backup/inc_backup_1 –incremental –no-timestamp /root/backup/inc_backup_2

查看备份的目录,能够看到以下文件夹。

[root@dk-14 3306]# ls /root/backup/

all_backup  inc_backup_1  inc_backup_2

all_backup、inc_backup_1、inc_backup_2 别离代表全量备份、第一次增量备份、第二次增量备份。第一次增量备份蕴含了 id 为 6、7 的增量数据,第二次增量备份蕴含了 id 为 8、9 的增量数据,上面咱们演示一下删除一些数据,而后利用增量备份复原的过程。

首先删除一些数据。

mysql> DELETE FROM t1 WHERE id=9;

Query OK, 1 row affected (0.06 sec)

mysql> DELETE FROM t2 WHERE id=9;

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

8 rows in set (0.00 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

7 rows in set (0.00 sec)

而后对备份进行 apply log,利用 redo 日志。

[root@dk-14 3306]# innobackupex –apply-log –redo-only

 /root/backup/all_backup

[root@dk-14 3306]# innobackupex –apply-log –redo-only –incremental /root/backup/all_backup –incremental-dir=/root/backup/inc_backup_1/

[root@dk-14 3306]# innobackupex –apply-log –incremental /root/backup/all_backup –incremental-dir=/root/backup/inc_backup_2/

–redo-only 是指在利用 redo 日志时有未提交的事务不做回滚,当前面还有其余增量备份要附加的时候须要加上这个参数。

利用完 redo 日志后,咱们将失落数据的数据库清掉,并移走数据文件, 创立新的数据目录。

[root@dk-14 3306]# mysqladmin -uroot -p12345678 -S /tmp/mysql-3306.sock shutdown

[root@dk-14 3306]# cd /dbase/

[root@dk-14 dbase]# mv 3306 3306bak

[root@dk-14 dbase]# mkdir 3306

[root@dk-14 dbase]# cd 3306/

[root@dk-14 3306]# mkdir binlog  data  logs  redo  relaylog  tmp  undo

[root@dk-14 3306]# chown -R mysql:mysql *

执行复原命令。

[root@dk-14 3306]# innobackupex –defaults-file=/etc/mysql/my-3306.cnf –copy-back /root/backup/all_backup

复原实现后,批改一下数据文件的权限,将数据库启动起来。

[root@dk-14 3306]# touch logs/err.log

[root@dk-14 3306]# chown -R mysql:mysql *

[root@dk-14 3306]# mysqld_safe –defaults-file=/etc/mysql/my-3306.cnf –user=mysql &

验证一下数据是否复原。

mysql> USE aa

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SHOW TABLES;

| Tables_in_aa |

| t1           |

| t2           |

2 rows in set (0.00 sec)

mysql> SELECT * FROM t1;

| id | name |

|  1 | aa   |

|  2 | bb   |

|  3 | cc   |

|  4 | dd   |

|  5 | ee   |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

|  9 | ii   |

9 rows in set (0.02 sec)

mysql> SELECT * FROM t2;

| id | name |

|  2 | bbb  |

|  3 | ccc  |

|  4 | ddd  |

|  5 | eee  |

|  6 | ff   |

|  7 | gg   |

|  8 | hh   |

|  9 | ii   |

8 rows in set (0.00 sec)

能够看到曾经复原出咱们删除数据之前的数据。

总结

本文讲述了 MySQL 数据库两种罕用的备份复原的形式,一种是逻辑备份形式 mysqldump,一种是物理备份形式 XtraBackup。

逻辑备份在备份发动时会先加一个全局读锁,而后先备份非 InnoDB 表,并对 InnoDB 表开启一个一致性快照读,当非 InnoDB 表备份实现、备份实例的 pos 信息获取实现、一致性快照开启胜利后,逻辑备份就会开释掉全局读锁,因而逻辑备份中数据的工夫是备份发动的工夫。

物理备份则是先 copy InnoDB 表的 ibd 文件,同时 copy 新生成的 redo 文件,copy 实现后给数据库加一个全局读锁,而后去 copy 非 InnoDB 表的数据文件以及 frm 文件,copy 实现后开释全局读锁实现备份。最初利用 redo 前滚数据到备份实现的时刻,因而物理备份中数据的工夫是备份完结的工夫。

逻辑备份实用于一些数据量较小的数据库或者是表数据的导入导出。物理备份适宜数据量较大的数据库,物理备份又有全量备份和增量备份两种形式,发动一次全量备份会耗费大量的性能,能够采纳全量 + 增量的形式来进行备份,比方周一做一次全量,周二到周日每天做一次增量。因为增量备份是 copy 差别的数据,所以对于一些交易量较大的 OLTP 零碎来说,批改的数据量太多,可能不适宜增量备份。

另外,因为备份并不是时刻都在进行的,如果咱们想复原数据到两次备份之间的一个工夫点,因为物理备份和逻辑备份都能够记录备份数据对应的日志地位,咱们便能够在备份的根底上,灵便的利用 binlog 来进行数据弥补的复原。

退出移动版