MySQL主从架构配置
有两台MySQL数据库服务器master和slave,master为主服务器,slave为从服务器,初始状态时,master和slave中的数据信息相同,当master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。

MySQL复制的基本过程
Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从
最开始的日志)之后的日志内容;
Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请
求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信
息中除了日志所包含的信息之外,还包括本次返回的信息在Master端的Binary Log
文件的名称以及在Binary Log中的位置;
Slave的IO线程接收到信息后,将接收到的日志内容依次写入到Slave端的
Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的binlog的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的
告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文
件中的内容成为在Master端真实执行时候的那些可执行的Query语句,并在自身执
行这些Query。这样,实际上就是在Master端和Slave端执行了同样的Query,所
以两端的数据是完全一样的。
应用场景
数据分布
负载均衡
备份
高可用和容错
创建同步帐号
在master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。
命令如下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'slave'@'192.168.0.171' IDENTIFIED BY '123456';
建立一个帐户slave,并且只能允许从192.168.0.171这个地址上来登陆。添加用户后,可在从服务器上用mysql -h192.168.0.151 -uslave -p123456; 来测试是否有权限访问主数据库。

手动同步数据
如果要为已经有数据的主服务器添加从服务器,要先把主库已经存在的数据先手动同步迁移到从库上面去。搭建过程中,禁止在主库从库上进行任何对数据库的ddl、dml等数据操作。
这里可以用mysqldump也可以用xtrabackup导出主库上面的数据,还可以直接用可视化管理工具(如navicat)把数据传输到从库上面。

配置master库
[mysqld]
server-id = 151 #唯一
log-bin = /data/mysql/binlog/mysql-bin
1
2
3
配置slave库
[mysqld]
server-id = 171 #唯一
log-bin = /var/log/mysql/mysql-bin
log_slave_updates = 1 #将复制事件写进自己的二进制日志
relay_log_index = /var/log/mysql/slave-relay-bin.index
relay_log = /var/log/mysql/slave-relay-bin
replicate-do-db = userdb
replicate-do-db = osadmin
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
1
2
3
4
5
6
7
8
9
10
11
到主服务器上查看主机状态,记录File和Position对应的值。
mysql> SHOW MASTER STATUS\G
File: mysql-bin.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1
2
3
4
5
6
File在binlog.000001 Position是120
在slave机器上连接主库并启动线程:

mysql> CHANGE MASTER TO
Master_Host='192.168.0.151',
Master_Port=3306,
Master_User='slave',
Master_Password='123456',
Master_Log_File='mysql-bin.000001',
Master_Log_Pos=120,
Master_Connect_Retry=60;
mysql> START SLAVE;
1
2
3
4
5
6
7
8
9
测试
slave:
mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
1
2
3
4
5
如果都是Yes,说明slave的I/O和SQL线程都已经开始运行,配置成功。

master:
mysql> SHOW PROCESSLIST\G
...
Id: 6
User: slave
Host: 192.168.0.171:52166
db: NULL
Command: Binlog Dump
Time: 278
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
1
2
3
4
5
6
7
8
9
10
可以看到slave的线程正在运行。如果我们在数据库中新建表和添加数据,在slave中也会同步。

踩过的坑
MySQL无法关闭或重启:
Warning: World-writable config file '/etc/my.cnf' is ignored

原因是my.cnf配置文件权限全局可写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件。这样mysql无法关闭。
解决办法:修改my.cnf权限 chmod 644 /etc/my.cnf
start slave出错:
[Err] 1872 - Slave failed to initialize relay log info structure from the repository

可能原因:my.cnf配置文件没指定relay_log或者指定路径错误,注意空格。
解决方法:
停止slave
mysql>STOP SLAVE;
在my.cnf中添加
relay_log=/var/log/mysql/relay_log
relay_log_index=/var/log/mysql/relay_log.index
重置slave日志并连接master
mysql>RESET SLAVE;
mysql>CHANGE MASTER TO
Master_Host='192.168.0.151',
Master_Port=3306,
Master_User='slave',
Master_Password='123456',
Master_Log_File='mysql-bin.000009',
Master_Log_Pos=159;
启动slave
mysql>START SLAVE;
无法同步,error.log:
[ERROR] Error reading packet from server: Misconfigured master - server_id was not set ( server_errno=1236)
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server_id was not set', Error_code: 1236

原因很明显,master没有设置server-id,这里要注意,server-id一定要写在[mysqld]下面,如果装的是wamp集成环境的话这个server-id默认在[wampmysqld]下面了,这是不行的。
解决办法:添加配置
[mysqld]
server-id = 1
无法同步,[SQL]SHOW SLAVE STATUS;
Last_Error:Error 'Unknown database 'userdb'' on query. Default database: 'userdb'...
或者
Last_Error:Error 'Table 'userdb.table' doesn't exist' on query. Default database: 'userdb'...
可能原因:master库中有userdb数据库和table表而slave中没有,而且同步之前没有把master库中已有的数据传到slave中。忘了哪里看到的好像数据库引擎不一样也可能会出现这个问题…
解决办法:手动将userdb数据库传到slave中并重新设置同步。
无法同步,[SQL]SHOW SLAVE STATUS;
Last_Error:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
原因:master_log_file文件名指定错误。
解决办法:在master上使用mysql> show master status\G 查看File并在slave上重新连接master。
配置项下划线和中杠要分清,比如:log-bin和log_bin
slave跟master的MySQL版本一致,是官方推荐的方式;至少版本前两个号相同,可高于master;版本不一致,可能出现的问题就是同步的不稳定(兼容性的老问题),因为会在某些函数处理、日志读取、日志的解析重演等上发生异常,导致同步报错而需手工处理。
注意检查防火墙
多说几句
官方文档推荐的是,在master端不指定binlog-do-db,在slave端用replication-do-db来过滤。
不要在my.cnf/my.ini中配制master_host等选项,而应该使用CHANGE MASTER TO命令来动态设置!Mysql版本从5.1.7以后开始就不支持”master-host”类似的参数。详情可以查看

MySQL主从架构配置的更多相关文章

  1. MySQL 主从架构配置详解

    无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...

  2. 使用Innobackupex快速搭建(修复)MySQL主从架构

    MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一.但对于较大的数据库则该方式并非理想的选择.使用Xtrabackup可以快速轻松的构建或修复mysql主从架构.本文 ...

  3. mysql主从之配置基本环境

    实验环境 master  192.168.132.121 主库 slave     192.168.132.122 从库 一 mysql的使用介绍 1.1 mysql单台服务器特点 缺点 单台服务器如 ...

  4. Mysql主从架构

    Mysql主从架构 1. 克隆虚拟机 克隆的虚拟机的网络适配,使得虚拟机可以进入局域网 vi /etc/sysconfig/network-scripts/ifcfg-eth0 删除 HWADDR所在 ...

  5. mysql主从同步配置(windows环境)

    mysql主从同步配置(mysql5.5,windows环境)   A主机(作为主服务器)环境:windows8.mysql5.5 ip:192.168.1.100(自己填) B主机(作为从服务器,由 ...

  6. Docker Mysql主从同步配置搭建

    Docker Mysql主从同步配置搭建 建立目录 在虚拟机中建立目录,例如路径/home/mysql/master/data,目录结构如下: Linux中 新建文件夹命令:mkdir 文件夹名 返回 ...

  7. MySQL主从备份配置实例

    转载自:https://www.cnblogs.com/ahaii/p/6307648.html MySQL主从备份配置实例 场景: 1.主服务器192.168.0.225.从服务器192.168.0 ...

  8. MySQL主从架构之Master-Slave主从同步

    MySQL复制 MySQL复制是指将主库上的DDL和DML操作通过二进制日志传到从库上,使主库和从库上的数据保持同步 复制原理: 主服务器将更新写入二进制日志文件,并维护文件的一个索引来跟踪日志循环. ...

  9. Mysql主从架构报错-Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work...

    在搭建Mysql主从架构过程中,由于从服务器是克隆的主服务器系统,导致主从mysql uuid相同, Slave_IO无法启动,报错如下: The slave I/O thread stops bec ...

随机推荐

  1. 初涉trie

    trie:字符串算法中的重要“数据结构” 什么是trie trie就是利用字符串的公共前缀所建成的树. 众所周知树是有很多很好的性质的,于是trie可以结合其他知识点做一些有趣的事情. trie的例题 ...

  2. 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

    1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...

  3. The twelve Day-前端之html

    前端知识之html内容 HTML介绍 1.web服务本质 import socket sk = socket.socket() sk.bind(()) sk.listen() while True: ...

  4. Python的第二堂课(1)

    一.编程语言的分类 机器语言:直接使用二进制命令去编写程序. 优点:执行效率高 缺点:开发效率低 汇编语言:用英文标签代替二进制命令去编写程序 优点:开发效率高于机器语言 缺点:执行效率低于机器语言 ...

  5. 查找闲置ip

    首先ping 一下该网段的广播地址,如ping 192.168.0.255 ,然后使用arp -a就可以查看到那些地址是被使用的,以及网卡的mac值.剩余的是暂时还未被使用的,当然没开机的机器就看不出 ...

  6. JavaScript正则表达式-反向引用

    使用括号“()”进行分组,使子表达式(子模式)可以作为整体独立被修饰,子表达式所匹配的结果会被记录下来并可以单独被访问. /(a(b(cd){2})+)EF/ 则各引用分别对应: \1  对应(a(b ...

  7. MySQL常用命令(三)---最值的搜索

    表结构存储数据如下: 需求如下: 1.每项物品的的最高价格是多少?(下面这个查询语句的结果集中你会发现 经销商(dealer)的值不对,第二个语句就是对的)2.对每项物品,找出最贵价格的物品的经销商. ...

  8. 检查DLL,EXE文件是64位或者32位的方法

    检查DLL,EXE文件是64位或者32位:输入corflags <assembly path>:

  9. Java实现——Socket网络通信的机制以及实现举例

    1. 网络间的进程通信与Socket TCP/IP协议族中网络层的IP地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程).这样利用这三元组就可以标识网络的进程了,网 ...

  10. visionPro工业视觉工具中英文一览表