MySQL主从数据库搭建指南,相信我,能让你的数据万无一失
2015-12-25 12:56
423 查看
原理:
mysql的整个主从复制过程实际上就是:slave端从master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作,所以binlog日志功能必须开启。
数据同步过程:
MySQL主从复制的基本交互过程,如下:
1、slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。
2、master端在接收到来自 slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文 件名以及在该binlog日志中的pos节点位置。
3、slave端的IO线程在接收 到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay- bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master-info(该文件存在slave 端)文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从哪个binlog文件的哪个pos节点位置开始,请把此节点以后的日志内容发给 我”。
4、slave端的SQL线程在检 测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺丰依次执行 这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和slave端的数据是完全一样的。
以上mysql主从复制交互过程比较复杂,理解起来也比较麻烦,我简化了该交互过程。如下:
1、master在执行sql之后,记录二进制log文件(bin-log)。
2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。
从以上mysql的Replication原理可以看出:
* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
* 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。
* 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。
* 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。
* 如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点
环境:
(以下是我这次搭建所使用的环境)
主数据库:
系统:ubuntu ; 数据库:MYSQL;
从数据库
系统:ubuntu ; 数据库:MYSQL;
步骤:
1.在两台mysql上创建同步用户,让两个mysql可以互相通过username/username用户访问对方。
(username是你的mysql用户名;pasword是你的mysql密码)
主执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'从ip' IDENTIFIED BY 'password' WITH GRANT OPTION;
从执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'主ip' IDENTIFIED BY 'password' WITH GRANT OPTION;
2.修改两台数据库的配置文件。
主数据库:
打开/etc/mysql/my.cnf: vi /etc/my.cnf 找到[mysqld]在其下添加下面选项:
(有的数据库配置文件路径可能是 /etc/my.cnf)
log-bin=mysql-bin //启用二进制日志文件
innodb_flush_log_at_trx_commit = 1 //默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。
sync_binlog=1 //这个跟上面那个差不多,1是最慢的也是最安全的
binlog-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可
binlog-ignore-db=mysql //不进行同步的数据库,对于多个数据库,重复选项多次即可
replicate-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可
server-id=1 //主数据库将server-id设置为1:
注意server-id选项必须打开,并且集群中每个mysql都要有一个单独的值,不能重复。一般设置主为1,从为2, 3, 4....。只要不相同什么整数都没有关系,也可以设置为IP的值,如:202,203.
得到主数据库二进制log文件和位置ip:
重启mysql;
执行sql语句:show master status;
结果:
记住File = mysql-bin.000001 Position =107;下面步骤要用到。
从数据库:
Vi /etc/mysql/my.cnf;
log-bin=mysql-bin #启用二进制日志文件
server-id=2 #设置数据库ID
binlog-do-db=databasename #二进制需要同步的数据库(多个用逗号分隔)
binlog-ignore-db=mysql #避免同步的数据库(多个用逗号分隔)
#配置主从同步
server-id=2 #从服务器ID
master-host=192.168.28.128 #主服务器IP
master-user=gnh1 #主服务器登陆名
master-password=112233 #主服务器登陆密码
master-port=3306 #主服务器断口
master-connect-retry=60 #断点从新连接时间(秒)
replicate-ignore-db=mysql #屏蔽对MYSQL库的同步
replicate-do-db=wuliu #二进制需要同步的数据库
文中该颜色部分可能已经过时,据网上消息介绍,Mysql版本从5.1.7以后开始就不支持“master-host” 类似的参数。所以可能报错:
[ERROR] mysqld: unknown variable ‘master-host=192.168.28.128′。
所以只需添加两行:
server-id = 2
replicate-do-db =dreamwriter //同步的数据库
执行SQL语句:
change master to master_host=’121.42.59.152’,master_user=’xx’, master_password=’xx’,master_log_file=’mysql-bin.000001′,master_log_pos=107;
查看从数据库配置状态(需要重启Mysql)
show slave status;
查看结果字段Slave_IO_State,一般应该为"Waiting for master to send event",此时Slave_IO_Running和Slave_SQL_Running应该为yes或者true,
如果不是,在slave端执行: stop slave; start slave; 重启复制进程。Replicate_Do_DB为要复制的数据库,和my.cnf配置的相同。
mysql的整个主从复制过程实际上就是:slave端从master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作,所以binlog日志功能必须开启。
数据同步过程:
MySQL主从复制的基本交互过程,如下:
1、slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容。
2、master端在接收到来自 slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文 件名以及在该binlog日志中的pos节点位置。
3、slave端的IO线程在接收 到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay- bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master-info(该文件存在slave 端)文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从哪个binlog文件的哪个pos节点位置开始,请把此节点以后的日志内容发给 我”。
4、slave端的SQL线程在检 测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺丰依次执行 这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和slave端的数据是完全一样的。
以上mysql主从复制交互过程比较复杂,理解起来也比较麻烦,我简化了该交互过程。如下:
1、master在执行sql之后,记录二进制log文件(bin-log)。
2、slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。
从以上mysql的Replication原理可以看出:
* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
* 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。
* 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。
* 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。
* 如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点
环境:
(以下是我这次搭建所使用的环境)
主数据库:
系统:ubuntu ; 数据库:MYSQL;
从数据库
系统:ubuntu ; 数据库:MYSQL;
步骤:
1.在两台mysql上创建同步用户,让两个mysql可以互相通过username/username用户访问对方。
(username是你的mysql用户名;pasword是你的mysql密码)
主执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'从ip' IDENTIFIED BY 'password' WITH GRANT OPTION;
从执行:GRANT ALL PRIVILEGES ON *.* TO 'username'@'主ip' IDENTIFIED BY 'password' WITH GRANT OPTION;
2.修改两台数据库的配置文件。
主数据库:
打开/etc/mysql/my.cnf: vi /etc/my.cnf 找到[mysqld]在其下添加下面选项:
(有的数据库配置文件路径可能是 /etc/my.cnf)
log-bin=mysql-bin //启用二进制日志文件
innodb_flush_log_at_trx_commit = 1 //默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。
sync_binlog=1 //这个跟上面那个差不多,1是最慢的也是最安全的
binlog-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可
binlog-ignore-db=mysql //不进行同步的数据库,对于多个数据库,重复选项多次即可
replicate-do-db=dreamwriter //需要进行同步的数据库,对于多个数据库,重复选项多次即可
server-id=1 //主数据库将server-id设置为1:
注意server-id选项必须打开,并且集群中每个mysql都要有一个单独的值,不能重复。一般设置主为1,从为2, 3, 4....。只要不相同什么整数都没有关系,也可以设置为IP的值,如:202,203.
得到主数据库二进制log文件和位置ip:
重启mysql;
执行sql语句:show master status;
结果:
记住File = mysql-bin.000001 Position =107;下面步骤要用到。
从数据库:
Vi /etc/mysql/my.cnf;
log-bin=mysql-bin #启用二进制日志文件
server-id=2 #设置数据库ID
binlog-do-db=databasename #二进制需要同步的数据库(多个用逗号分隔)
binlog-ignore-db=mysql #避免同步的数据库(多个用逗号分隔)
#配置主从同步
server-id=2 #从服务器ID
master-host=192.168.28.128 #主服务器IP
master-user=gnh1 #主服务器登陆名
master-password=112233 #主服务器登陆密码
master-port=3306 #主服务器断口
master-connect-retry=60 #断点从新连接时间(秒)
replicate-ignore-db=mysql #屏蔽对MYSQL库的同步
replicate-do-db=wuliu #二进制需要同步的数据库
文中该颜色部分可能已经过时,据网上消息介绍,Mysql版本从5.1.7以后开始就不支持“master-host” 类似的参数。所以可能报错:
[ERROR] mysqld: unknown variable ‘master-host=192.168.28.128′。
所以只需添加两行:
server-id = 2
replicate-do-db =dreamwriter //同步的数据库
执行SQL语句:
change master to master_host=’121.42.59.152’,master_user=’xx’, master_password=’xx’,master_log_file=’mysql-bin.000001′,master_log_pos=107;
查看从数据库配置状态(需要重启Mysql)
show slave status;
查看结果字段Slave_IO_State,一般应该为"Waiting for master to send event",此时Slave_IO_Running和Slave_SQL_Running应该为yes或者true,
如果不是,在slave端执行: stop slave; start slave; 重启复制进程。Replicate_Do_DB为要复制的数据库,和my.cnf配置的相同。
相关文章推荐
- MySQL 日志管理
- JSP连接MySQL时出现--错误:Access denied for user 'root'@'localhost' (using password: YES)'解决方案
- JSP连接MySQL时出现--错误:Access denied for user 'root'@'localhost' (using password: YES)'解决方案
- Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
- 【原创】mysql 错误缓冲堆栈
- 【原创】mysql 错误缓冲堆栈
- 【原创】mysql 错误缓冲堆栈
- MySQL学习【1】MySQL安装与配置
- MySql group by 根据区间分组统计
- MySQL 触发器简单实例
- mysql开启慢查询日志
- Mysql 大小写问题
- MYSQL的FOUND_ROWS()函数(获得上个结果的数量)
- Windows下使用mysqldump命令导入/导出.sql文件
- 记录-mysql的sql执行效率方法
- mysql主从复制报错 :Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
- mysql 5.7压缩包安装笔记
- MySQL数据库的概念
- mysql 字段添加、删除、修改
- mysql分区表设计(二)