MySQL数据库的实时备份知识点详解
前言
数据库实时备份的需求很常见,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.%