在本章中,我们将介绍以下配方:
在设置数据库之后,下一件重要的事情是设置备份。在本章中,您将学习如何设置各种类型的备份。执行备份主要有两种方法。一种是逻辑备份,它将所有数据库、表结构、数据和存储的例程导出到一组 SQL 语句中,这些 SQL 语句可以再次执行以重新创建数据库的状态。另一种类型是物理备份,它包含数据库用于存储所有数据库实体的系统上的所有文件:
mysqldump
、mysqlpump
和mydumper
(未随 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.proc
和mysql.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
另一个分发线程的示例有三个线程用于db1
和db2
,两个线程用于db3
和db4
,其余数据库有四个线程:
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 USER
或GRANT
语句中用户的备份;相反,您必须备份mysql.user
表。使用mysqlpump
,您可以将用户账户转储为账户管理对账单(CREATE USER
和GRANT
,而不是插入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
类似的逻辑备份工具。
mydumper
与mysqldump
相比具有以下优势:
mysqlpump
不保证一致性。mysqlpump
将所有内容写入一个文件,这限制了加载选择性数据库对象的选项。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
包含ROUTINES
、TRIGGERS
和EVENTS
employees.employees.sql
以INSERT
语句的形式包含实际数据您可以使用regex
选项包括/排除特定数据库。以下命令将从备份中排除mysql
和test
数据库:
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。此方法不用于日常备份,但非常适合在升级或降级的维护窗口期间,或在进行主机交换时使用。
shell> sudo service mysqld stop
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
shell> sudo service mysqld start
XtraBackup 是 Percona 提供的开源备份软件。它在不关闭服务器的情况下复制平面文件,但为了避免不一致,它使用重做日志文件。它被许多公司广泛用作标准备份工具。其优点是,与逻辑备份工具相比,它的速度非常快,而且恢复速度也非常快。
这就是 Percona XtraBackup 的工作原理(摘自 Percona XtraBackup 文档):
复制您的InnoDB
数据文件,导致数据内部不一致;但随后它会对文件执行崩溃恢复,使它们再次成为一致的、可用的数据库。
这是因为InnoDB
维护一个重做日志,也称为事务日志。它包含对InnoDB
数据的每次更改的记录。当InnoDB
启动时,它检查数据文件和事务日志,并执行两个步骤。它将提交的事务日志条目应用于数据文件,并对修改数据但未提交的任何事务执行撤消操作。
Percona XtraBackup 的工作原理是在启动时记住日志序列号(LSN),然后复制数据文件。执行此操作需要一些时间,因此如果文件正在更改,则它们会反映数据库在不同时间点的状态。同时,Percona XtraBackup 运行后台进程,监视事务日志文件,并从中复制更改。Percona XtraBackup 需要不断地这样做,因为事务日志是以循环方式编写的,并且可以在一段时间后重用。Percona XtraBackup 自开始执行以来,每次更改数据文件都需要事务日志记录。
在撰写本文时,MySQL 8 不支持 Percona XtraBackup。最终,Percona 将发布支持 MySQL 8 的新版本 XtraBackup;因此,仅涵盖安装。
以下各节介绍了安装步骤。
mysql-community-libs-compat
:shell> sudo yum install -y mysql-community-libs-compat
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%]
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
shell> sudo yum install percona-xtrabackup-24
shell> wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
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
文件中检查存储库设置。
shell> sudo apt-get update
shell> sudo apt-get install percona-xtrabackup-24
从 MySQL 8 开始,您可以锁定实例进行备份,这将允许 DML 在在线备份期间进行备份,并阻止所有可能导致快照不一致的操作。
开始备份之前,请锁定要备份的实例:
mysql> LOCK INSTANCE FOR BACKUP;
执行备份,完成后解锁实例:
mysql> UNLOCK INSTANCE;
您知道,时间点恢复需要二进制日志。在本节中,您将了解如何备份二进制日志。该进程将二进制日志从数据库服务器流式传输到远程备份服务器。您可以从从属服务器或主服务器获取二进制日志备份。如果您从主服务器进行二进制日志备份,从服务器进行实际备份,则应使用--dump-slave
获取相应的主服务器日志位置。如果您使用的是mydumper
或 XtraBackup,它会给出主二进制日志位置和从二进制日志位置。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'binlog_user'@'%' IDENTIFIED BY 'binlog_pass';Query OK, 0 rows affected, 1 warning (0.03 sec)
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
。
nohup
或disown
:shell> mysqlbinlog -u <user> -p<pass> -h <server> --read-from-remote-server --stop-never
--to-last-log --raw server1.000008 &
shell> disown -a
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