MySQL8 备份详解

在本章中,我们将介绍以下配方:

在设置数据库之后,下一件重要的事情是设置备份。在本章中,您将学习如何设置各种类型的备份。执行备份主要有两种方法。一种是逻辑备份,它将所有数据库、表结构、数据和存储的例程导出到一组 SQL 语句中,这些 SQL 语句可以再次执行以重新创建数据库的状态。另一种类型是物理备份,它包含数据库用于存储所有数据库实体的系统上的所有文件:

  • 逻辑备份实用程序mysqldumpmysqlpumpmydumper(未随 MySQL 提供)
  • 物理备份实用程序:XtraBackup(未随 MySQL 提供)和平面文件备份

对于时间点恢复,备份应能够提供备份所处的二进制日志位置。这称为一致性备份

强烈建议将从机备份到从机上安装的文件服务器上。

mysqldump是广泛使用的逻辑备份工具。它提供了多种选项来包括或排除数据库、选择要备份的特定数据、只备份没有数据的模式,或者只备份存储的例程而不备份任何其他内容,等等。

mysqldump实用程序与mysql二进制文件一起提供,因此您需要单独安装它。本节介绍了大多数生产场景。

语法如下:

shell> mysqldump [options]

在选项中,可以指定要连接到数据库的用户名、密码和主机名,如下所示:

--user <user_name> --password <password>
or
-u <user_name> -p<password>

在本章中,--user--password并非在每个示例中都提到,以使读者专注于其他重要选项。

这可以通过以下方式完成:

shell> mysqldump --all-databases > dump.sql

--all-databases选项对所有数据库和表进行备份。>操作符将输出重定向到dump.sql文件。在 MySQL 8 之前,存储过程和事件存储在mysql.procmysql.event表中。从 MySQL 8 开始,对应对象的定义存储在data dictionary表中,但这些表不会转储。要在使用--all-databases生成的转储中包含存储的例程和事件,请使用--routines--events选项。

要包括例程和事件:

shell> mysqldump --all-databases --routines --events > dump.sql

您可以打开dump.sql文件查看其结构。前几行是转储时的会话变量。接下来是CREATE DATABASE语句,后面是USE DATABASE命令。接下来是DROP TABLE IF EXISTS语句,后面是CREATE TABLE;然后我们有实际的插入数据的INSERT语句。由于数据存储为 SQL 语句,因此称为逻辑备份

您会注意到,当您恢复转储时,DROP TABLE语句将在创建表之前删除所有表。

要获取时间点恢复,您应该指定--single-transaction--master-data

--single-transaction选项通过将事务隔离模式更改为REPEATABLE READ并在进行备份之前执行START TRANSACTION来提供一致性备份。它仅适用于事务表,如InnoDB,因为它会转储发布START TRANSACTION时数据库的一致状态,而不会阻塞任何应用程序。

--master-data选项将服务器的二进制日志坐标打印到dump文件中。如果为--master-data=2,则打印为注释。它还使用FLUSH TABLES WITH READ LOCK语句获取二进制日志的快照。如第 5 章事务所述,当存在任何长期运行的事务时,这可能非常危险:

shell> mysqldump --all-databases --routines --events --single-transaction --master-data > dump.sql

备份总是在从机上进行。要获取备份时主机的二进制日志坐标,可以使用--dump-slave选项。如果要从主服务器进行二进制日志备份,请使用此选项。否则,请使用--master-data选项:

shell> mysqldump --all-databases --routines --events --single-transaction --dump-slave > dump.sql

输出如下:

--
-- Position to start replication or point-in-time recovery from (the master of this slave)
--
CHANGE MASTER TO MASTER_LOG_FILE='centos7-bin.000001', MASTER_LOG_POS=463;

要仅备份特定数据库,请执行以下操作:

shell> mysqldump --databases employees > employees_backup.sql

要仅备份特定表,请执行以下操作:

shell> mysqldump --databases employees --tables employees > employees_backup.sql

要忽略某些表,可以使用--ignore-table=database.table选项。要指定要忽略的多个表,请多次使用该指令:

shell> mysqldump --databases employees --ignore-table=employees.salary > employees_backup.sql

mysqldump帮助您过滤备份的数据。假设您希望备份 2000 年后加入的员工:

shell> mysqldump --databases employees --tables employees --databases employees --tables employees  --where="hire_date>'2000-01-01'" > employees_after_2000.sql

您可以使用LIMIT子句来限制结果:

shell> mysqldump --databases employees --tables employees --databases employees --tables employees  --where="hire_date >= '2000-01-01' LIMIT 10" > employees_after_2000_limit_10.sql

有时,您可能没有对数据库服务器的 SSH 访问权限(如 AmazonRDS 等云实例)。在这些情况下,您可以使用mysqldump从远程服务器备份到本地服务器。为此,您需要提到使用--hostname选项的hostname。确保用户具有连接和执行备份的适当权限:

shell> mysqldump --all-databases --routines --events --triggers --hostname <remote_hostname> > dump.sql

可能存在这样的情况:您希望在另一台服务器上使用不同的模式。在这种情况下,您必须转储和恢复模式,根据需要更改模式,然后转储和恢复数据。根据您拥有的数据量,使用数据更改模式可能需要很长时间。请注意,只有当修改的模式与插入兼容时,此方法才有效。修改后的表可以有额外的列,但它应该有原始表中存在的所有列。

您可以使用--no-data仅转储架构:

shell> mysqldump --all-databases --routines --events --triggers --no-data > schema.sql

您可以使用以下选项仅获取数据转储,不包括架构。

--complete-insert将打印INSERT语句中的列名,当您在修改的表中有额外的列时,这将有所帮助:

shell> mysqldump --all-databases --no-create-db --no-create-info --complete-insert > data.sql

您可以采用任何一种方式进行备份,以替换旧数据或保留旧数据,以防发生冲突。

假设您想将生产数据库中的数据恢复到已经有一些数据的开发机器上。如果要将生产数据与开发数据合并,可以使用--replace选项,该选项将使用REPLACE INTO语句而不是INSERT语句。您还应该包括--skip-add-drop-table选项,它不会将DROP TABLE语句写入dump文件。如果您有相同数量的表和结构,还可以包括--no-create-info选项,该选项将跳过dump文件中的CREATE TABLE语句:

shell> mysqldump --databases employees --skip-add-drop-table --no-create-info --replace > to_development.sql

如果在生产环境中有一些额外的表,则在恢复时前面的转储将失败,因为该表在开发服务器上不存在。在这种情况下,您不应该在恢复时添加--no-create-info选项并使用force选项。否则,还原将在CREATE TABLE失败,表示该表已经存在。不幸的是,mysqldump没有提供CREATE TABLE IF NOT EXISTS选项。

写入dump文件时,可以使用INSERT IGNORE语句,而不是REPLACE。这将保留服务器上的现有数据并插入新数据。

mysqlpump是一个与mysqldump非常相似的程序,具有一些额外的功能。

有很多方法可以做到这一点。让我们详细看看每一个。

通过指定线程数(基于 CPU 数),可以加快转储过程。例如,使用八个线程进行完整备份:

shell> mysqlpump --default-parallelism=8 > full_backup.sql

您甚至可以为每个数据库指定线程数。在我们的例子中,employees数据库与company数据库相比非常大。因此,您可以为employees生成四个线程,为company数据库生成两个线程:

shell> mysqlpump -u root --password --parallel-schemas=4:employees --default-parallelism=2 > full_backup.sql
Dump progress: 0/6 tables, 250/331145 rows
Dump progress: 0/34 tables, 494484/3954504 rows
Dump progress: 0/42 tables, 1035414/3954504 rows
Dump progress: 0/45 tables, 1586055/3958016 rows
Dump progress: 0/45 tables, 2208364/3958016 rows
Dump progress: 0/45 tables, 2846864/3958016 rows
Dump progress: 0/45 tables, 3594614/3958016 rows
Dump completed in 6957

另一个分发线程的示例有三个线程用于db1db2,两个线程用于db3db4,其余数据库有四个线程:

shell> mysqlpump --parallel-schemas=3:db1,db2 --parallel-schemas=2:db3,db4 --default-parallelism=4 > full_backup.sql

您会注意到,有一个进度条可以帮助您估计时间。

对以prod结尾的所有数据库进行备份:

shell> mysqlpump --include-databases=%prod --result-file=db_prod.sql

假设在某些数据库中有一些测试表,您希望将它们从备份中排除;您可以使用--exclude-tables选项进行指定,该选项将在所有数据库中排除名为test的表:

shell> mysqlpump --exclude-tables=test --result-file=backup_excluding_test.sql

每个包含和排除选项的值都是以逗号分隔的适当对象类型名称列表。对象名称中允许使用通配符:

  • %匹配零个或多个字符的任意序列

  • _匹配任何单个字符

除了数据库和表之外,还可以包括或排除触发器、例程、事件和用户,例如,--include-routines--include-events--exclude-triggers

有关包含和排除选项的更多信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/mysqlpump.html#mysqlpump-过滤

mysqldump中,您不会得到CREATE USERGRANT语句中用户的备份;相反,您必须备份mysql.user表。使用mysqlpump,您可以将用户账户转储为账户管理对账单(CREATE USERGRANT,而不是插入mysql系统数据库:

shell> mysqlpump --exclude-databases=% --users > users_backup.sql

您还可以通过指定--exclude-users选项排除某些用户:

shell> mysqlpump --exclude-databases=% --exclude-users=root --users > users_backup.sql

您可以压缩备份以最小化磁盘空间和网络带宽。您可以使用--compress-output=lz4--compress-output=zlib

请注意,您应该具有适当的解压缩实用程序:

shell> mysqlpump -u root -pxxxx --compress-output=lz4 > dump.lz4

要解压缩,请执行以下操作:

shell> lz4_decompress dump.lz4 dump.sql

使用zlib执行以下操作:

shell> mysqlpump -u root -pxxxx --compress-output=zlib > dump.zlib

要解压缩,请执行以下操作:

shell> zlib_decompress dump.zlib dump.sql

您会注意到,在输出中,CREATE TABLE语句省略了次要索引。这将加快恢复过程。使用ALTER TABLE语句将索引添加到INSERT的末尾。

指标将在第 13 章性能调整中介绍。

Previously, it was possible to dump all tables in the mysql system database. As of MySQL 8, mysqldump and mysqlpump dump only non-data dictionary tables in that database.

mydumper是与mysqlpump类似的逻辑备份工具。

mydumpermysqldump相比具有以下优势:

  • 并行性(因此,速度)和性能(避免了昂贵的字符集转换例程,并且总体上具有高效的代码)。
  • 一致性它跨所有线程维护快照,提供准确的主日志和从日志位置,等等。mysqlpump不保证一致性。
  • 更易于管理输出(表和转储元数据的单独文件,并且易于查看/解析数据)。mysqlpump将所有内容写入一个文件,这限制了加载选择性数据库对象的选项。
  • 使用 regex 包含和排除数据库对象。
  • 用于终止阻止备份和所有后续查询的长时间运行事务的选项。

mydumper是一款开源备份工具,需要单独安装。本节将介绍 Debian 和 Red Hat 系统的安装步骤以及mydumper的使用。

让我们从安装开始,然后我们将在本配方中列出的每一小节中学习许多与备份相关的内容。

安装先决条件:

在 Ubuntu/Debain 上:

shell> sudo apt-get install libglib2.0-dev libmysqlclient-dev zlib1g-dev libpcre3-dev cmake git

在红帽/CentOS/软呢帽上:

shell> yum install glib2-devel mysql-devel zlib-devel pcre-devel cmake gcc-c++ git
shell> cd /opt
shell> git clone https://github.com/maxbube/mydumper.git
shell> cd mydumper
shell> cmake .

shell> make
Scanning dependencies of target mydumper
[ 25%] Building C object CMakeFiles/mydumper.dir/mydumper.c.o
[ 50%] Building C object CMakeFiles/mydumper.dir/server_detect.c.o
[ 75%] Building C object CMakeFiles/mydumper.dir/g_unix_signal.c.o

shell> make install
[ 75%] Built target mydumper
[100%] Built target myloader
Linking C executable CMakeFiles/CMakeRelink.dir/mydumper
Linking C executable CMakeFiles/CMakeRelink.dir/myloader
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/mydumper
-- Installing: /usr/local/bin/myloader

或者,使用 YUM 或 APT,您可以在这里的找到发布版本 https://github.com/maxbube/mydumper/releases

#YUM
shell> sudo yum install -y "https://github.com/maxbube/mydumper/releases/download/v0.9.3/mydumper-0.9.3-41.el7.x86_64.rpm"

#APT
shell> wget "https://github.com/maxbube/mydumper/releases/download/v0.9.3/mydumper_0.9.3-41.jessie_amd64.deb"

shell> sudo dpkg -i mydumper_0.9.3-41.jessie_amd64.deb
shell> sudo apt-get install -f

以下命令将所有数据库备份到/backups文件夹中:

shell> mydumper -u root --password=<password> --outputdir /backups

/backups文件夹中创建了多个文件。每个数据库都有它的CREATE DATABASE语句作为<database_name>-schema-create.sql,每个表都有自己的模式和数据文件。模式文件存储为<database_name>.<table>-schema.sql,数据文件存储为<database_name>.<table>.sql

视图存储为<database_name>.<table>-schema-view.sql。存储的例程、触发器和事件存储为<database_name>-schema-post.sql(如果未创建目录,则使用sudo mkdir –pv /backups

shell> ls -lhtr /backups/company*
-rw-r--r-- 1 root root 69 Aug 13 10:11 /backups/company-schema-create.sql
-rw-r--r-- 1 root root 180 Aug 13 10:11 /backups/company.payments.sql
-rw-r--r-- 1 root root 239 Aug 13 10:11 /backups/company.new_customers.sql
-rw-r--r-- 1 root root 238 Aug 13 10:11 /backups/company.payments-schema.sql
-rw-r--r-- 1 root root 303 Aug 13 10:11 /backups/company.new_customers-schema.sql
-rw-r--r-- 1 root root 324 Aug 13 10:11 /backups/company.customers-schema.sql

如果有超过 60 秒的查询,mydumper将失败,并出现以下错误:

** (mydumper:18754): CRITICAL **: There are queries in PROCESSLIST running longer than 60s, aborting dump,
 use --long-query-guard to change the guard value, kill queries (--kill-long-queries) or use  different server for dump

为了避免这种情况,您可以传递--kill-long-queries选项或将--long-query-guard设置为更高的值。

--kill-long-queries选项将终止所有大于 60 秒的查询或--long-query-guard设置的值。请注意,--kill-long-queries也会由于错误(而终止复制线程 https://bugs.launchpad.net/mydumper/+bug/1713201

shell> sudo mydumper --kill-long-queries --outputdir /backups** (mydumper:18915): WARNING **: Using trx_consistency_only, binlog coordinates will not be accurate if you are writing to non transactional tables.
** (mydumper:18915): WARNING **: Killed a query that was running for 368s

backup目录中的元数据文件包含用于一致备份的二进制日志坐标。

在主机上,它捕获二进制日志位置:

shell> sudo cat /backups/metadata 
Started dump at: 2017-08-20 12:44:09
SHOW MASTER STATUS:
    Log: server1.000008
    Pos: 154
    GTID:

在从属设备上,它捕获主设备和从属设备的二进制日志位置:

shell> cat /backups/metadataStarted dump at: 2017-08-26 06:26:19
SHOW MASTER STATUS:
 Log: server1.000012
 Pos: 154
 GTID:
SHOW SLAVE STATUS:
 Host: 35.186.158.188
 Log: master-bin.000013
 Pos: 4633
 GTID:
Finished dump at: 2017-08-26 06:26:24

以下命令将employees数据库的employees表备份到/backups目录中:

shell> mydumper -u root --password=<password> -B employees -T employees --triggers --events --routines  --outputdir /backups/employee_table
shell> ls -lhtr /backups/employee_table/
total 17M
-rw-r--r-- 1 root root 71 Aug 13 10:35 employees-schema-create.sql
-rw-r--r-- 1 root root 397 Aug 13 10:35 employees.employees-schema.sql
-rw-r--r-- 1 root root 3.4K Aug 13 10:35 employees-schema-post.sql
-rw-r--r-- 1 root root 75 Aug 13 10:35 metadata
-rw-r--r-- 1 root root 17M Aug 13 10:35 employees.employees.sql

文件的约定如下:

  • employees-schema-create.sql包含CREATE DATABASE语句
  • employees.employees-schema.sql包含CREATE TABLE语句
  • employees-schema-post.sql包含ROUTINESTRIGGERSEVENTS
  • employees.employees.sqlINSERT语句的形式包含实际数据

您可以使用regex选项包括/排除特定数据库。以下命令将从备份中排除mysqltest数据库:

shell> mydumper -u root --password=<password> --regex '^(?!(mysql|test))' --outputdir /backups/specific_dbs

要加快大表的转储和恢复,可以将其拆分为小块。区块大小可以由其包含的行数指定,每个区块将写入一个单独的文件:

shell> mydumper -u root --password=<password> -B employees -T employees --triggers --events --routines --rows=10000 -t 8 --trx-consistency-only --outputdir /backups/employee_table_chunks
  • -t:指定线程数
  • --trx-consistency-only:如果您只使用跨国表,例如InnoDB,使用此选项将最小化锁定
  • --rows:将表拆分为此数量行的块

对于每个区块,创建一个文件作为<database_name>.<table_name>.<number>.sql;数字用五个零填充:

shell> ls -lhr /backups/employee_table_chunks
total 17M
-rw-r--r-- 1 root root 71 Aug 13 10:45 employees-schema-create.sql
-rw-r--r-- 1 root root 75 Aug 13 10:45 metadata
-rw-r--r-- 1 root root 397 Aug 13 10:45 employees.employees-schema.sql
-rw-r--r-- 1 root root 3.4K Aug 13 10:45 employees-schema-post.sql
-rw-r--r-- 1 root root 633K Aug 13 10:45 employees.employees.00008.sql
-rw-r--r-- 1 root root 634K Aug 13 10:45 employees.employees.00002.sql
-rw-r--r-- 1 root root 1.3M Aug 13 10:45 employees.employees.00006.sql
-rw-r--r-- 1 root root 1.9M Aug 13 10:45 employees.employees.00004.sql
-rw-r--r-- 1 root root 2.5M Aug 13 10:45 employees.employees.00000.sql
-rw-r--r-- 1 root root 2.5M Aug 13 10:45 employees.employees.00001.sql
-rw-r--r-- 1 root root 2.6M Aug 13 10:45 employees.employees.00005.sql
-rw-r--r-- 1 root root 2.6M Aug 13 10:45 employees.employees.00009.sql
-rw-r--r-- 1 root root 2.6M Aug 13 10:45 employees.employees.00010.sql

为了提供一致的备份,mydumper通过执行FLUSH TABLES WITH READ LOCK获取GLOBAL LOCK

您已经看到,如果存在任何长时间运行的事务,使用FLUSH TABLES WITH READ LOCK是多么危险(在第 5 章事务中解释)。为了避免这种情况,您可以传递--kill-long-queries选项以终止阻塞查询,而不是中止mydumper

  • --trx-consistency-only:这相当于mysqldump--single-transaction,但有一个binlog位置。显然,这个位置只适用于事务表。使用此选项的一个优点是,全局读锁仅为线程的协调而保留,因此事务一开始就释放它。
  • --use-savepoints减少元数据锁定问题(需要SUPER权限)。

您可以指定--compress选项来压缩备份:

shell> mydumper -u root --password=<password> -B employees -T employees -t 8 --trx-consistency-only --compress --outputdir /backups/employees_compress
shell> ls -lhtr /backups/employees_compress
total 5.3M
-rw-r--r-- 1 root root 91 Aug 13 11:01 employees-schema-create.sql.gz
-rw-r--r-- 1 root root 263 Aug 13 11:01 employees.employees-schema.sql.gz
-rw-r--r-- 1 root root 75 Aug 13 11:01 metadata
-rw-r--r-- 1 root root 5.3M Aug 13 11:01 employees.employees.sql.gz

您可以使用--no-schemas选项跳过架构并进行仅数据备份:

shell> mydumper -u root --password=<password> -B employees -T employees -t 8 --no-schemas --compress --trx-consistency-only --outputdir /backups/employees_data

这是一种物理备份方法,通过直接复制data directory中的文件进行备份。由于新数据是在复制文件时写入的,因此备份将不一致,无法使用。为了避免这种情况,您必须关闭 MySQL,复制文件,然后启动 MySQL。此方法不用于日常备份,但非常适合在升级或降级的维护窗口期间,或在进行主机交换时使用。

  1. 关闭 MySQL 服务器:
shell> sudo service mysqld stop
  1. 将文件复制到data directory(您的目录可能不同):
shell> sudo rsync -av /data/mysql /backups
or do rsync over ssh to remote server
shell> rsync -e ssh -az /data/mysql/ backup_user@remote_server:/backups
  1. 启动 MySQL 服务器:
shell> sudo service mysqld start

XtraBackup 是 Percona 提供的开源备份软件。它在不关闭服务器的情况下复制平面文件,但为了避免不一致,它使用重做日志文件。它被许多公司广泛用作标准备份工具。其优点是,与逻辑备份工具相比,它的速度非常快,而且恢复速度也非常快。

这就是 Percona XtraBackup 的工作原理(摘自 Percona XtraBackup 文档):

  1. 复制您的InnoDB数据文件,导致数据内部不一致;但随后它会对文件执行崩溃恢复,使它们再次成为一致的、可用的数据库。

  2. 这是因为InnoDB维护一个重做日志,也称为事务日志。它包含对InnoDB数据的每次更改的记录。当InnoDB启动时,它检查数据文件和事务日志,并执行两个步骤。它将提交的事务日志条目应用于数据文件,并对修改数据但未提交的任何事务执行撤消操作。

  3. Percona XtraBackup 的工作原理是在启动时记住日志序列号LSN),然后复制数据文件。执行此操作需要一些时间,因此如果文件正在更改,则它们会反映数据库在不同时间点的状态。同时,Percona XtraBackup 运行后台进程,监视事务日志文件,并从中复制更改。Percona XtraBackup 需要不断地这样做,因为事务日志是以循环方式编写的,并且可以在一段时间后重用。Percona XtraBackup 自开始执行以来,每次更改数据文件都需要事务日志记录。

在撰写本文时,MySQL 8 不支持 Percona XtraBackup。最终,Percona 将发布支持 MySQL 8 的新版本 XtraBackup;因此,仅涵盖安装。

以下各节介绍了安装步骤。

  1. 安装mysql-community-libs-compat
shell> sudo yum install -y mysql-community-libs-compat
  1. 安装 Percona 存储库:
shell> sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

您应该看到一些输出,如以下内容:

Retrieving http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
Preparing...                ########################################### [100%]
   1:percona-release        ########################################### [100%]
  1. 测试存储库:
shell> yum list | grep xtrabackup
holland-xtrabackup.noarch 1.0.14-3.el7 epel 
percona-xtrabackup.x86_64 2.3.9-1.el7 percona-release-x86_64
percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_64
percona-xtrabackup-24.x86_64 2.4.8-1.el7 percona-release-x86_64
percona-xtrabackup-24-debuginfo.x86_64 2.4.8-1.el7 percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64 2.3.9-1.el7 percona-release-x86_64
percona-xtrabackup-test.x86_64 2.3.9-1.el7 percona-release-x86_64
percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona-release-x86_64
percona-xtrabackup-test-24.x86_64 2.4.8-1.el7 percona-release-x86_64
  1. 安装 XtraBackup:
shell> sudo yum install percona-xtrabackup-24
  1. 从 Percona 获取存储库包:
shell> wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
  1. 使用dpkg安装下载的软件包。为此,以root或与sudo一起运行以下命令:
shell> sudo dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb

安装此软件包后,应添加 Percona 存储库。您可以在/etc/apt/sources.list.d/percona-release.list文件中检查存储库设置。

  1. 请记住更新本地缓存:
shell> sudo apt-get update
  1. 之后,您可以安装软件包:
shell> sudo apt-get install percona-xtrabackup-24

从 MySQL 8 开始,您可以锁定实例进行备份,这将允许 DML 在在线备份期间进行备份,并阻止所有可能导致快照不一致的操作。

开始备份之前,请锁定要备份的实例:

mysql> LOCK INSTANCE FOR BACKUP;

执行备份,完成后解锁实例:

mysql> UNLOCK INSTANCE;

您知道,时间点恢复需要二进制日志。在本节中,您将了解如何备份二进制日志。该进程将二进制日志从数据库服务器流式传输到远程备份服务器。您可以从从属服务器或主服务器获取二进制日志备份。如果您从主服务器进行二进制日志备份,从服务器进行实际备份,则应使用--dump-slave获取相应的主服务器日志位置。如果您使用的是mydumper或 XtraBackup,它会给出主二进制日志位置和从二进制日志位置。

  1. 在服务器上创建复制用户。创建强密码:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'binlog_user'@'%' IDENTIFIED BY 'binlog_pass';Query OK, 0 rows affected, 1 warning (0.03 sec)
  1. 检查服务器上的二进制日志:
mysql> SHOW BINARY LOGS;+----------------+-----------+
| Log_name       | File_size |
+----------------+-----------+
| server1.000008 |      2451 |
| server1.000009 |       199 |
| server1.000010 |      1120 |
| server1.000011 |       471 |
| server1.000012 |       154 |
+----------------+-----------+
5 rows in set (0.00 sec)

您可以在服务器上找到第一个可用的二进制日志;从这里,您可以启动备份。在这种情况下,它是server1.000008

  1. 登录备份服务器并执行以下命令。这将把二进制日志从 MySQL 服务器复制到备份服务器。您可以开始使用nohupdisown
shell> mysqlbinlog -u <user> -p<pass> -h <server> --read-from-remote-server --stop-never 
--to-last-log --raw server1.000008 &
shell> disown -a
  1. 验证是否正在备份二进制日志:
shell> ls -lhtr server1.0000*-rw-r-----. 1 mysql mysql 2.4K Aug 25 12:22 server1.000008
-rw-r-----. 1 mysql mysql  199 Aug 25 12:22 server1.000009
-rw-r-----. 1 mysql mysql 1.1K Aug 25 12:22 server1.000010
-rw-r-----. 1 mysql mysql  471 Aug 25 12:22 server1.000011
-rw-r-----. 1 mysql mysql  154 Aug 25 12:22 server1.000012 

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

微服务架构实战160讲 -〔杨波〕

从0开始做增长 -〔刘津〕

后端技术面试 38 讲 -〔李智慧〕

Django快速开发实战 -〔吕召刚〕

Spark核心原理与实战 -〔王磊〕

体验设计案例课 -〔炒炒〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

快手 · 音视频技术入门课 -〔刘歧〕

现代React Web开发实战 -〔宋一玮〕