数据库读写分离的好处有:数据备份、 提升数据库性能、缓解高并发等。

读写分离就是弄了两个数据库: 主数据库master 和 从数据库 slave,slave只用来都读取数据,master读写均可(建议只用来写入数据)。 所有在master写入的数据都会同步到slave里面去,保持两个数据库里面的数据一致。

当然,从数据库可以弄多个的,但主数据只需要有一个。其原理就是在主数据库执行的sql语句会以二进制的形式记录在主数据库的日志文件里,N个从数据库都会获取到这个日志文件并执行,这样主和从 数据库都有新插入的这一条数据了。

下面说下主从数据库 配置流程
1.主从数据库的配置文件修改
2.创建专用账户并授权和进行主从复制

详细教程

  1. 主从数据库配置
    1.1 主数据库配置。
    1.1.1 到主数据库mysql 的安装目录下找到my.inf(linux下的是my.cnf,一般在etc目录下)打开编辑,在 mysqld 这行下面新增如下
server-id=1 # 服务器唯一标识,必须唯一
log-bin=master-bin # mysq的二进制日志。即被执行过的sql都记录在这里
log-bin-index=master-bin.index

以下内容可选添加
binlog_do_db=db_test # 要复制的数据库名称,若要复制多个数据库则多写几行。把数据库名称db_test修改一下即可
binlog_ignore_db #不要复制的数据库名称,若要复制多个,同上
这两项互斥,左右添加一个就行。若都没添加则所有存在的数据库都会进行主从复制

1.1.2 重启主库mysql服务生效。window可以在本地服务里面重启,linux可以使用命令service mysql restart

1.1.3 检查配置效果,进入主数据库并执行SHOW MASTER STATUS; 如下图表示配置成功(若未配置或未成功则执行结果为空)

mysql数据库分割函数 mysql数据库分离数据_sql

1.2 从数据库配置
与上面一样编辑从数据库的my.inf,在mysqld 这行下面新增如下

server-id=2 # 从服务器唯一标志,不设置或者为0则无法连接到主库。 如有多个从库,要取不同的名称
relay-log=slave-relay-bin # 从库二进制日志文件。主要作用是备份,若主库挂了可以拿去给主库恢复数据
relay-log-index=slave-relay-bin.index

以下内容可选添加
replicate_do_db=db_test # 要复制的数据库名称,若要复制多个数据库则多写几行。把数据库名称db_test修改一下即可
replicate_ignore_db #不要复制的数据库名称,若要复制多个,同上
这两项互斥,左右添加一个就行。
若主库配置了这二者,则从库也就没必要在配置了。

重启从库mysql服务

  1. 创建专用账户并授权进行主从复制
    2.1 在主库创建专用账户与授权
CREATE USER repl; # 创建用户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库ip地址' IDENTIFIED BY '123456'; # 授权
FLUSH PRIVILEGES;

创建了一个用户repl密码是123456并授予REPLICATION SLAVE权限,ON *.*的点表示有权限复制主库的所有数据库,从库ip地址 可以设置为全ip例如139.22.22.22表示只能从139.22.22.22这个ip访问主库,也可以设置通配符例如139.22.22.%,或者直接是%表示任意ip都可访问主库。

2.2 在从库设置主从复制

CHANGE MASTER TO MASTER_HOST='主库IP地址',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=299;

这里设置了主服务器ip和端口,访问主数据库的用户repl和密码。MASTER_LOG_FILE和MASTER_LOG_POS的值来源与1.1.3的查询结果,截图里面的File 和 Position,查询出来是什么值,这里则替换成相应的值。

2.3 启动主从复制和查看运行状态
启动:在从库执行 START SLAVE;(停止主从同步的命令为 STOP SLAVE;)
查看:在从库执行 SHOW MASTER STATUS \G;
若看到Slave_IO_Running(作用是从主库拿日志文件)和Slave_SQL_Running(作用是执行主库日志文件里的sql)都为yes,则表示从数据库已经在等待主库的消息了,接下来在主库的操作,在从库都会执行了。

至此所有设置已完毕,可以去测试了。在主库创表插入数据等操作后的结果在从库里面也都会有。

其他说明:

  1. 若主库本来就有数据,现在添加从库,则在本教程之前要记得把主库的数据先导入到从库里面。如果停服了可以使用mysqldump直接导入或者直接复制数据文件,即使不能停服的话也最好先锁库(FLUSH TABLES WITH READ LOCK;),操作完后在解锁 (UNLOCK TABLES;),以防备份过程中又有新数据写入。
  2. 从库复制主库数据就是执行主库日志文件里面一条条sql语句。如果某条执行一旦出错则后面的sql就不会执行了,也就是停止了主从同步。
    可以通过STOP SLAVE;SET GLOBAL sql_slave_skip_counter=1;START SLAVE;来解决,其意思就是跳过执行出错的那条sql,这样舍弃了这一条sql而能确保后面的sql都能继续执行下去。