欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL数据库的实时备份知识点详解

程序员文章站 2022-07-05 17:35:12
前言 数据库实时备份的需求很常见,mysql本身提供了 replication 机制,摘译官方介绍如下: mysql replication 可以将一个主数据库中的数据...

前言

数据库实时备份的需求很常见,mysql本身提供了 replication 机制,摘译官方介绍如下:

mysql replication 可以将一个主数据库中的数据同步到一个或多个从数据库中。并且这个同步过程默认以异步方式工作,不需要保持主从数据库的实时连接(即允许连接中断)。同时允许自定义配置需同步的数据库及数据表。

mysql replication 的优点及应用场景如下:

1、通过 mysql replication 实现负载均衡与读写分离(主数据库仅更新,从数据库仅读取),提升数据库性能。

2、通过 mysql replication 实现数据的实时备份,保证数据安全。

3、通过 mysql replication 实现数据的离线分析(主数据库生成数据,从数据库分析计算不影响主数据库性能)。

4、数据分发。

mysql replication完整的官方文档请参阅:

工作原理

1111

1、master中的所有数据库变更事件写入binary log文件

2、当在slave中执行“slave start”命令时,开启slave i/o thread,并连接master

3、master侦测到slave i/o thread的连接,开启log jump thread进行响应

4、master binary log经master log jump thread和slave i/o thread传输至slave relay log

5、slave sql thread将relay log还原至数据,同步完成

注:可使用“show processlist”命令在master和slave中查看对应线程的运行情况

配置master

开启binary log并设置serverid,serverid必须唯一,取值范围1至232-1

[mysqld]
# 开启binary log
log-bin=mysql-bin
# 设置全局id
server-id=1

# 指定需同步的数据库(因为数据库名称可能包含逗号,因此多个数据库必须重复配置多次而不能以逗号分隔)
binlog-do-db=database_name
# 指定禁止同步的数据库
binlog-ignore-db=database_name
# 指定binary log格式
binlog_format=mixed

创建同步帐号

因为每个slave均需要使用帐号密码连接至主数据库,所以在主数据库上必须提供帐号。建议使用一个独立帐号,仅授权数据同步权限。

create user 'repl'@'%.example.com' identified by 'password';
grant replication slave on *.* to 'repl'@'%.example.com';

获取binary log信息

slave启动i/o thread时需要传入binary log部分信息,因此需要获取一下binary log信息:

show master status;

使用“show master status”命令获取binary log信息,并记录file和position字段值。

同步前保证master与slave的数据一致

在slave启动i/o thread前,需确保master与slave的数据一致,因此先对master进行锁定(防止数据变更),手动同步并确保数据一致后再解锁。

flush tables with read lock;

手动数据同步相关操作略...

unlock tables;

配置slave

设置serverid,可不必开启binlog:

[mysqld]
# 设置全局id
server-id=2

# 指定同步的数据库
replicate-do-db=database_name
# 指定禁止同步的数据库
replicate_ignore_db=database_name

设置master信息,执行如下命令:

mysql> change master to
  ->   master_host='master_host_name',
  ->   master_port='master_host_port',
  ->   master_user='replication_user_name',
  ->   master_password='replication_password',
  ->   master_log_file='recorded_log_file_name',
  ->   master_log_pos=recorded_log_position;

启动i/o thread

start slave;

查看同步状态:

show slave status;

master的binlog_format 参数

binlog_format用于配置binary log的格式,支持如下三种类型:

row

按数据行的变化进行记录,该模式与sql语句、存储过程、函数、触发器等无关,它只关心每一行的数据是否发生变化,如变化则记录,因此row模式是准确度最高的。但它的缺点是某些情况下会产生大量内容而导致效率下降,比如表结构发生变更时。

statement

按sql语句进行记录,很明显这个解决了row模式的短板,但问题是准确度不够高,因为sql语句可以非常复杂并且容易出现意外情况。

mixed

row与statement混合模式,由mysql自动决定什么时候使用row,什么时候使用statement,这也是默认模式。

replicate-do-db注意事项

当在slave中使用replicate-do-db和replicate-ignore-db配置项时,需特别注意,跨数据库的sql语句将不会被同步,如:

replicate-do-db=a
use b;
update a.some_table set some_field = 'some value';

解决方案是使用replicate_wild_do_table和replicate_wild_ignore_table,如:

replicate_wild_do_table=database_name.%
replicate_wild_ignore_table=database_name.%