为了提高数据库读写性能,读写分离的思想被提了出来。数据库被分成主数据库和从数据库,主数据库负责写,从数据库负责读。
拿Mysql来说,Mysql5.7版本自带了主从同步功能。比如需要将Mysql文件夹再多复制一份
mysql_1是主,mysql_2是从。
修改mysql_1的my.ini配置文件。
[mysql] default-character-set=utf8 [mysqld] # 同台主机下多个mysql要修改成不同的端口 port=13306 basedir=D:/Users/dagger/IdeaProjects/software/mysqllist/mysql_1 datadir=D:/Users/dagger/IdeaProjects/software/mysqllist/mysql_1/data character-set-server=utf8 default-storage-engine=InnoDB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 修改server_id,确保每个mysql实例的server_id不一样 server_id=13306 log-bin=mysql-bin # 要同步的数据库 binlog-do-db=test_0 binlog-do-db=test_1 # 不要同步的数据库 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=mysql binlog-ignore-db=sys [client] port=13306 default-character-set=utf8
修改mysql_2的my.ini配置文件
[mysql] default-character-set=utf8 [mysqld] # 记得修改这个端口,避免端口冲突 port=13307 basedir=D:/Users/dagger/IdeaProjects/software/mysqllist/mysql_2 datadir=D:/Users/dagger/IdeaProjects/software/mysqllist/mysql_2/data character-set-server=utf8 default-storage-engine=InnoDB sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # server_id也不能重复 server_id=13307 # 二进制日志备份 log-bin=mysql-bin # 要同步的表 replicate_wild_do_table=test_0.% replicate_wild_do_table=test_1.% # 不要同步的表,从节点不同步的数据库 replicate_wild_ignore_table=information_schema.% replicate_wild_ignore_table=performance_schema.% replicate_wild_ignore_table=mysql.% replicate_wild_ignore_table=sys.% [client] port=13307 default-character-set=utf8
安装mysql主从节点的服务
在mysql_1/bin目录下:./mysqld --install mysql_1 --defaults-file="mysql_1目录my.ini"
在mysql_2/bin目录下:./mysqld --install mysql_2 --defaults-file="mysql_2目录my.ini"
启动两个Mysql服务:
连接主节点,创建一个用户,并授权replication(可以同步主节点上的数据)。给从节点登陆并同步主节点上的数据。
create user 'slave_1'@'%' identified by 'slave_1'; grant replication slave on *.* to 'slave_1'@'%' identified by 'slave_1';
查看主节点的日志状态
show master status;
可以看到,test_0和test_1数据库已经配置好同步了。information_schema,performance_schema,mysql,sys被忽略。
连接上mysql_2数据库。创建同步任务。master_log_file对应 show master status; 的File。master_log_pos对应Position。
change master to master_host='127.0.0.1', master_user='slave_1', master_password='slave_1', master_port=13306, master_log_file='mysql-bin.000008', master_log_pos=154;
查看同步任务是否开启成功, SHOW SLAVE STATUS; Slave_IO_Running和Slave_SQL_Running都为Yes,开启成功。
如果Slave_IO_Running为No或者Connecting,则查看server_id是否重复,如果没有重复,则去mysql_2data目录下,将auto.cnf删除,然后重启mysql_2服务。