mysql主从配置
配置前准备
1、准备2个mysql环境
2、两个mysql网络互通
mysql安装还是比较简单的,这里不在复述, 这里用的mysql5.7;
mysql主从最好在数据库服务搭建之初就配置好,不然后续再配置比较麻烦,如果是生产环境,涉及到添加配置、重启等;
一、更改主从mysql的配置文件
1、master:
[mysql] default-character-set=utf8mb4 [client] port = 3306 default-character-set=utf8 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid user = mysql bind-address = 0.0.0.0 character-set-server = utf8mb4 max_connections = 2000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 default_storage_engine = InnoDB innodb_buffer_pool_size = 4G interactive_timeout = 28800 wait_timeout = 28800 character-set_server=utf8mb4 collation-server=utf8mb4_bin lower_case_table_names=1 init_connect='SET NAMES utf8' ######主从相关配置值###### server-id = 1 # 节点ID,确保唯一 log-bin = mysql-bin #开启mysql的binlog日志功能,binlog日志位置 sync_binlog = 1 #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全 binlog_format = mixed #binlog日志格式,mysql默认采用statement,建议使用mixed expire_logs_days = 7 #binlog过期清理时间 max_binlog_size = 100m #binlog每个日志文件大小 binlog_cache_size = 4m #binlog缓存大小 binlog-do-db=test1 #需要同步的数据库 binlog-do-db=test2 #需要同步的数据库 slave-skip-errors = all #跳过从库错误 [mysqldump] max_allowed_packet = 128M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M
2、slave:
[mysql] default-character-set=utf8mb4 [client] port = 3306 default-character-set=utf8 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid user = mysql bind-address = 0.0.0.0 character-set-server = utf8mb4 max_connections = 2000 max_connect_errors = 6000 open_files_limit = 65535 table_open_cache = 128 default_storage_engine = InnoDB innodb_buffer_pool_size = 4G interactive_timeout = 28800 wait_timeout = 28800 character-set_server=utf8mb4 collation-server=utf8mb4_bin lower_case_table_names=1 init_connect='SET NAMES utf8' ######主从相关配置值###### server-id = 2 # 节点ID,确保唯一 log-bin = mysql-bin #如果从数据库,不需要再往其他数据库同步,可以注释掉 relay-log=slave-relay-bin #必须开启,从主数据库同步的binlog会写入到该目录下 relay-log-index=slave-relay-bin
relay_log_recovery=1
relay_log_purge=1 #如果主从数据库名称相同 #replication-do-db=数据库名 #如果主从数据库名称不同 #replication-rewrite-db= 主数据库名 -> 从数据库名 [mysqldump] max_allowed_packet = 128M [myisamchk] key_buffer_size = 8M sort_buffer_size = 8M read_buffer = 4M write_buffer = 4M
重启主从mysql服务;
二、master配置
1、创建一个用户名为rep,密码为123456的账户,该账户可以被192.168.253网段下的所有ip地址使用,且该账户只能进行主从同步:
mysql > grant replication slave, REPLICATION CLIENT on *.* to ‘rep’@‘192.168.253.%’ identified by ‘123456’; mysql> FLUSH PRIVILEGES;
2、刷新所有的表,同时给数据库加上一把锁,阻止对数据库进行任何的写操作:
mysql > flush tables with read lock;
3、获取master二进制日志的信息:
mysql > show master status;
File
的值是当前使用的二进制日志的文件名,Position
是该日志里面的位置信息,记住这两个值,会在下面配置从服务器时用到。
如果之前的服务器并没有配置使用二进制日志,那么使用上面的sql语句会显示空;
4、在锁表之后,导出数据库里的数据(如果数据库里没有数据,可以忽略这一步):
[root@master]# mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases > /server/backup/mysql_bak.$(date +%F).sql
如果数据量很大,可以在导出时就压缩为原来的大概三分之一:
[root@master]# mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
5、对数据库解锁,恢复对主数据库的操作
mysql > unlock tables;
三、slave配置
1、如果主服务器导出了数据,下面就导入该文件,如果主服务器没有数据,就忽略这一步
如果从主服务器上拿过来的是压缩文件,就先解压再导入
[root@slave]# mysql -uroot -p'123456' -S /data/3306/data/mysql.sock < /server/backup/mysql_bak.2015-07-01.sql
2、配置同步参数,登陆mysql,执行如下命令
CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='replication_user_name', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='recorded_log_file_name',MASTER_LOG_POS='POS',
3、启动主从同步进程
mysql > start slave;
查看状态:
mysql > show slave status\G
上面的两个进程都显示YES则表示配置成功;
四、测试
此时可以创建表,插入数据,看slave是否会自动同步过来;