注意:mysql版本最好一致,否则可能存在二进制文件识别出错
第一步:修改配置文件 windows环境 修改my.ini (在mysql安装目录下)linux环境 /etc/my.cnf 修改完需要重启服务器
在[mysqld] 下添加
必须 1.server-id=xxx ##数据库唯一标识,必须不同
必须 2.log-bin=文件名 ##表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提;
3.binlog-do-db=xxx ##表示需要记录二进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
4.binlog-ignore-db=xxx ##表示不需要记录二进制日志的数据库。如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项
必须 5.replicate-do-db ##表示需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项
6.replicate-ignore-db ##表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db=MySQL选项
7.log-slave-updates=1或0,默认关闭 ##配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步
8.slave-skip-errors=[err1,err2,...all] ##在复制过程,由于各种原因导致binlog中的sql出错,默认情况下,从库会停止复制,要用户介入。
##可以设置slave-skip-errors来定义错误号,如果复制过程中遇到的错误号是定义的错误号,便可以跳过。
##如果从库是用来做备份,设置这个参数会存在数据不一致,不要使用。如果是分担主库的查询压力,可以考虑。
9.sync_binlog ##sync_binlog的默认值是0,这种模式下,MySQL不会同步到磁盘中去。这样的话,MySQL依赖操作系统来刷新二进制日志binary log,
##就像操作系统刷其他文件的机制一样。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了。
##要想防止这种情况,你可以使用sync_binlog全局变量,使binlog在每N次binlog写入后与硬盘同步。
##当sync_binlog变量设置为1是最安全的,因为在crash崩溃的情况下,你的二进制日志binary log只有可能丢失最多一个语句或者一个事务。
##但是,这也是最慢的一种方式(除非磁盘有使用带蓄电池后备电源的缓存cache,使得同步到磁盘的操作非常快)。
##即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。
##如果使用InnoDB表,MySQL服务器处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。
##如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍然存在binlog中。
##可以用–innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。
##(注释:在MySQL 5.1中不需要–innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),
##该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,
##该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。
##这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收回滚的语句)。
10.auto_increment_offset ##增量初值
11.auto_increment_increment ##增量值
##9和10组合使用解决同步过程中自增主键冲突
12.slave_net_timeout ##单位为秒 默认设置为 3600秒 减少因网络原因造成的延迟
第二步:设置主服务器slave (注:在不需要双机备份的情况下,不需要设置slave,只需要从服务器设置slave)
1.登陆mysql mysql -u user -p dbname
附加:查看master信息
show master status
2.停止同步传输过程 stop slave;
3.设置slave
3.1
change master to
master_host=‘192.168.1.118‘, ##主机地址 (必须)
master_user=‘root‘, ##主机拥有同步权限的用户 (必须)
master_password=‘12345‘, ##密码 (必须)
master_log_file=‘mysql-bin.000023‘, ##主服务器上查询的二进制文件名称 对应file (一般从服务器会从主服务器直接读取,在同步过程出现异常或者中断需要人为干预,需要记录该值)
master_log_pos=107, ##主服务器文件记录位置 对应position (一般从服务器会从主服务器直接读取,在同步过程出现异常或者中断需要人为干预,需要记录该值)
master-connect-retry=60; ##服务器重连时间默认60秒 减少因网络原因造成的延迟
4.启动slave
start slave;
5.查看slave 状态(show slave status\G;)
slave状态中
Slave_IO_Running: Yes ##说明可以正常进行IO操作---与主机进行通信
Slave_SQL_Running: Yes ##说明可以正常执行sql 语句 ---负责自身sql操作
注意:只有同时为Yes时,才可正常进行主从复制
解决方案:IO错误,要检查主从服务器之间的通信状态以及数据库之间通信状态
SQL错误, 1.检查主机processlist show prcesslist查看是否有挂起的任务
2.show slave status\G; 查看错误情况 需要跳过错误继续执行同步,
先关闭slave,然后 set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;跳过错误,再次启动slave,(一般是)
3.重新设置主从
3.1 进入主库锁表 FLUSH TABLES WITH READ LOCK;
3.2 导出要备份的数据库 mysqldump -u root -p backuptest>bacuptest.sql
3.3 进入从服务器新建数据库 导入数据 source bacuptest.sql;
3.4 停止slave stop slave,
3.5 从主服务器重新获取二进制文件和位置信息(设置master,同3.1 二进制文件名称和记录位置必须)
3.6 启动slave;
第三步:设置从服务器slave
1、如果需要实现双机互为备份,需要和主服务器同样的设置
2、问题解决同第二步
Mysql数据库主从复制
延迟
一般通过架构调优解决
比如主库是写,对数据安全性较高,sync_binlog=1,innodb_flush_log_at_trx_commit = 1
从库是读,sync_binlog=0
读写分离
注:一般做读写分离需要主库和从库有一个共有的用户
1、框架实现后台数据库切换
2、mysql_proxy(lua脚本实现,lua脚本配置复杂)
3、Amoeba for MySQL(使用较方便,但不支持事务和存储过程)