MySQL主从备份配置
一、简介
主从备份模式,主库(maser)和备份库(slave)数据完全一致。实现数据的多重备份,保障数据的安全性。一般用于读写分离,主库master(InnoDB)用于写、从库slave(MyISAM)用于读取。
从库(MyISAM)一般使用DQL语法操作。
主从模式中,对主库master的所有操作,都会同步到备库slave中。注意,主库和备库的初始环境必须完全一致,库、表的初始完全相同。如果master有db1,db2,而slave中只有db1,那么在master执行drop database db2时,从库slave会报错,一旦报错,那么之后对master的所有操作,slave都不会再同步执行。此时,只能重新去建立主从备份模式。
二、配置详解
1、环境说明
windows + MySQL 5.7
2、初始化MySQL
2.1、本地windows环境,下载的免安装版本,解压缩,修改文件夹名称master01。并在master01目录下新增data文件夹,供数据库文件存放。
2.2、master01中新建my.ini文件,其中配置如下:
[client] # 设置mysql客户端连接服务端时默认使用的端口 port=3318 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 port=3318 # 默认存储引擎innoDB,从库可设置MyISAM default-storage-engine=INNODB # 配置数据库服务器id,主从配置中必须唯一。 server-id=1 # 配置mysql的安装路径 basedir=E:\\soft\\cluster\\mysql\\master01 # 配置mysql的数据库文件存放位置。也即mysql data的存放位置。 datadir=E:\\soft\\cluster\\mysql\\master01\\data # 配置可访问mysql服务的机器ip地址信息。 0.0.0.0代表不限。 bind-address=0.0.0.0 # 配置允许最大连接数 max_connections=200 # 实现级联的同步,例如双主双从中,masterA、masterB互为主从,slaveB为masterB的从库,那么masterB中必须设置级联参数,这样,在masterA中的更新才能够最终执行到slaveB上 # 此参数默认关闭状态,如果不手动设置,那么bin-log只会记录直接在本库中执行的SQL语句, # 而由复制replication机制的SQL线程读取的reply-log而执行的SQL是不会记录到bin-log中的,那么也就是说,无法再继续的执行相关的SQL。那么保证不了最终一致性 # 简单说就是设置主服务器之间复制的数据是否需要往下面的从服务器中去复制,有这个字段表示往下面的从服务器中去复制 # 在多个主从配置的时候,根据业务场景选择是否添加此参数 log-slave-updates # 配置二进制文件binlog # 这里配置定义的只是个index索引文件,即会生成的是mysql-bin.index文件,而实际存储数据的是类似于mysql-bin.000001之类的文件,超出范围会继续生成mysql-bin.000002,以此类推 log-bin=mysql-bin # 配置bin-log文件的模式。 # STATEMENT:基于sql语句级别,记录每一条修改数据的sql语句。mysql默认采用策略 # ROW:基于行的级别。记录每一行记录的变化,也即记录每一行的修改都记录binlog中,不记录sql语句。记录数据行的变化。在全表修改的时候,会产生大量的日志记录 # MIXED:上述两种混合模式。默认使用STATEMENT,特殊情况下切换ROW。比如DML更新INNODB表。 binlog_format = MIXED # 刷盘配置,默认为0,表示的是刷盘时间由OS来决定,每隔一段时间就会刷新缓存数据到磁盘中 # 可设置值,代表的是没多少个事务提交刷一次binlog #sync_binlog=0
2.3、复制master01文件夹,分别命名为slave01、master02、slave02
2.4、分别修改slave01、master02、slave02中的my.ini配置文件,端口号port分别修改为3319、3320、3321。数据库服务器server-id分别为2、3、4(一般可设置为ip+port)。
存储目录baseDir和dataDir分别修改为对应目录。
2.5、slave01、slave02的my.ini配置文件中,修改存储引擎为 default-storage-engine=MyISAM,去除 log-slave-updates 配置。
2.6、开启是个命令行窗口分别进入四份数据库的 bin 目录下,执行 mysqld --initialize 初始化数据库,初始化成功后,可看到data目录下生成了一些列的初始文件。
2.7、分别执行 mysqld --console 启动 MySQL服务,启动成功后,不要关闭命令行窗口。此种方式,ctrl+c终止批处理命令或者关闭了窗口,都会是将MySQL服务停止。
3、配置双主双从
3.1、双主双从模式下的结构图如下:
3.2、另外开启四个命令窗口,分别进入四个bin目录下,执行 mysql -uroot -p 初始无密码进入MySQL。
分别执行 set password for root@localhost=password('123456'); 修改root密码
3.3、主库master01、master02分别创建备库使用的授权账户信息: GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'127.0.0.1' IDENTIFIED BY 'slavepwd1111';
执行成功后,刷新权限信息: flush privileges;
重置master日志文件信息: reset master; 注意:此命令不能用于任何slave正在正在运行的主从关系的主库。此命令会重置主库的binlog日志记录文件,删除所有的已有的binlog文件,初始化的创建一个从000001开始的新的日志文件,如果非首次搭建,主库中存量数据,此命令最好不要使用。会丢失binlog日志文件。
3.4、查看主库日志文件 show master status; 此时一般显示如下:
上图中的File列中的内容,后面对应的从库配置的时候,需要填入配置的。
3.5、主从库的同步配置
master01、slave02执行:
stop slave; reset slave; change master to master_host='127.0.0.1',master_port=3320,master_user='slaveuser',master_password='slavepwd1111',master_log_file='mysql-bin.000001'; start slave;
master02、slave01执行:
stop slave; reset slave; change master to master_host='127.0.0.1',master_port=3318,master_user='slaveuser',master_password='slavepwd1111',master_log_file='mysql-bin.000001'; start slave;
其中的用户名、密码、binlog配置都在前面中配置查看到。
启动完成后,从库的日志文件中会有类似下面的语句:
3.6、查看从库是否正常,执行 show slave status \G; ,如果为以下数据,错误数为0,从库连接主库配置无误
三、总结
以上配置完双主双从后,在任何一个主库中的操作,都会同步执行到四份数据库实例中,达到一定的数据备份、数据库高可用的功能。
另外,文中的MySQL启动方式 mysqld --console 是为了方便看日志记录,也可以进行 mysql install; net start mysql;net stop mysql;进行服务的启停。
本地测试的时候,可新建两个bat批处理,一次性启动 4 个MySQL服务,一次性启动连接是个MySQL,简单如下:
1、启动MySQL服务 start_mysql.bat
@echo off echo "start mysql..." start "master01" e:/soft/cluster/mysql/master01/bin/mysqld --console start "slave01" e:/soft/cluster/mysql/slave01/bin/mysqld --console start "master02" e:/soft/cluster/mysql/master02/bin/mysqld --console start "slave02" e:/soft/cluster/mysql/slave02/bin/mysqld --console #pause
2、启动MySQL命令行并连接 connect-mysql.bat
@echo off echo "start mysql..." start "master01-connect" e:/soft/cluster/mysql/master01/bin/mysql -uroot -p123456 start "slave01-connect" e:/soft/cluster/mysql/slave01/bin/mysql -uroot -p123456 start "master02-connect" e:/soft/cluster/mysql/master02/bin/mysql -uroot -p123456 start "slave02-connect" e:/soft/cluster/mysql/slave02/bin/mysql -uroot -p123456 #pause