分布式和备份
# 主从复制
将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
# 作用
- 主数据库出现问题,可以切换到从数据库。
- 可以进行数据库层面的读写分离。
- 可以在从数据库上进行日常备份。
# 解决的问题
- 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
- 负载均衡:降低单个服务器的压力
- 高可用和故障切换:帮助应用程序避免单点失败
- 升级测试:可以用更高版本的MySQL作为从库
# 工作原理
- master提交完事务后,写入binlog (Binary log:主数据库的二进制日志)
- slave连接到master,获取binlog
- master创建dump线程,推送binglog到slave
- slave启动一个IO线程读取同步过来的master的binlog,记录到relay log中继日志中 (Relay log:从服务器的中继日志)
- slave再开启一个sql线程读取relay log事件并在slave执行,完成同步
- slave记录自己的binglog
# 读写分离
读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读(如果对slave执行写操作,那么show slave status将会呈现Slave_SQL_Running=NO,此时你需要按照前面提到的手动同步一下slave)。
- 使用mysql-proxy代理
- 使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。
- 使用AbstractRoutingDataSource+aop+annotation在service层决定数据源
# 数据恢复
MySQL的binlog日志是MySQL日志中非常重要的一种日志,记录了数据库所有的DML操作。通过binlog日志我们可以进行数据库的读写分离、数据增量备份以及服务器宕机时的数据恢复。
# 根据位置导出 SQL 文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v \
--start-position "2508132" --stop-position "2511004" \
--database test_binlog mysql-bin.000034 \
> /home/mysql_backup/test_binlog_step1.sql
mysqlbinlog --no-defaults --base64-output=decode-rows -v \
--start-position "2508813" --stop-position "2509187" \
--database test_binlog mysql-bin.000034 \
> /home/mysql_backup/test_binlog_step2.sql
# 使用 mysql 进行恢复
mysql -u cisco -p < /home/mysql_backup/test_binlog_step1.sql
mysql -u cisco -p < /home/mysql_backup/test_binlog_step2.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
MySQL 5.7 - 通过 BINLOG 恢复数据 - 来份锅包肉 - 博客园 (cnblogs.com) (opens new window)
编辑 (opens new window)
上次更新: 2021/04/13, 13:33:16