如何设置MySQL同步Replication.docx
- 文档编号:6654665
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:16
- 大小:28.82KB
如何设置MySQL同步Replication.docx
《如何设置MySQL同步Replication.docx》由会员分享,可在线阅读,更多相关《如何设置MySQL同步Replication.docx(16页珍藏版)》请在冰豆网上搜索。
如何设置MySQL同步Replication
如何设置MySQL同步(Replication)
MySQL提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。
本文描述了常见的同步设置方法。
一、准备服务器
由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。
本文中,我们假设主服务器(以下简称Master)和从服务器(以下简称Slave)的版本都是5.0.15,操作系统是LinuxUbuntu5.0.x。
假设同步Master的主机名为:
rep1,Slave主机名为:
rep2,2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:
/usr/local/mysql/data。
二、设置同步服务器
1、设置同步Master
每个同步服务器都必须设定一个唯一的编号,否则同步就不能正常运行了。
接下来开始修改f,增加以下几行:
server-id=1
log-bin
set-variable=binlog-ignore-db=mysql
然后在Master上增加一个账号专门用于同步,如下:
mysql>GRANTREPLICATIONSLAVEON*.*TOrep@rep2IDENTIFIEDBY'rep';
如果想要在Slave上有权限执行"LOADTABLEFROMMASTER"或"LOADDATAFROMMASTER"语句的话,必须授予全局的FILE和SELECT权限:
mysql>GRANTFILE,SELECT,REPLICATIONSLAVEON*.*TOrep@rep2IDENTIFIEDBY'rep';
第三行表示不记录数据库mysql的更新日志,这就避免了Master上的权限设置等被同步到Slave上,如果对这方面没有限制,就可以不设置这个参数。
接下来备份Master上的数据,首先执行如下SQL语句:
mysql>FLUSHTABLESWITHREADLOCK;
不要退出这个终端,否则这个锁就不生效了;接着导出数据,可以直接打包压缩数据文件,也可以使用mysqldump工具来做,推荐前者的方法,这样更为快捷简便。
root$cd/usr/local/mysql
root$tarzcfdata.tar.gz./data(在这里也可能是"var"等其它实际存放数据文件的目录,根据实情而定)
然后将这些数据拷贝到Slave服务器上,解开,设置好正确的权限及属主等;之后,执行"UNLOCKTABLES"语句来释放锁。
2、设置Slave
修改f,增加如下几行:
server-id=2
master-host=rep1#主服务器名
master-user=rep#同步账户名,默认是test
master-password=rep#同步帐户密码,默认是空
master-port=3306#主服务器的TCP/IP端口号,默认是3306
set-variable=replicate-ignore-db=mysql#略过同步的数据库名,如果有多个,请设置多次
set-variable=replicate-do-db=yejr#想要同步的数据库名,如果有多个,请设置多次
接下来在Slave上检验一下是否能正确连接到Master上,并且具备相应的权限。
root$mysql-hrep1-urep-prep
mysql>SHOWGRANTS;
+------------------------------------------------------------------------------+
|Grantsforrep@rep2|
+------------------------------------------------------------------------------+
|GRANTSELECT,FILE,REPLICATIONSLAVEON*.*TO'rep'@'rep2'IDENTIFIEDBY
PASSWORD'*9FF2C222F44C7BBA5CC7E3BE8573AA4E1776278C'|
+------------------------------------------------------------------------------+
现在,可以启动Slave了。
启动成功后,登录Slave,查看一下同步状态:
mysql-hlocalhost-uroot
mysql>SHOWSLAVESTATUS\G
***************************1.row***************************
Slave_IO_State:
Waitingformastertosendevent
Master_Host:
rep1
Master_User:
rep
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
binlog.000001
Read_Master_Log_Pos:
98
Relay_Log_File:
relay.000003
Relay_Log_Pos:
232
Relay_Master_Log_File:
binlog.000001
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
0
Last_Error:
Skip_Counter:
0
Exec_Master_Log_Pos:
98
Relay_Log_Space:
232
Until_Condition:
None
Until_Log_File:
Until_Log_Pos:
0
Master_SSL_Allowed:
No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
0
1rowinset(0.00sec)
可以看到,Slave_IO_Running和Slave_SQL_Running两列的值都为"Yes",这表明Slave的I/O和SQL线程都在正常运行。
至此,同步设定成功。
三、同步设定FAQ
请查看
也谈mysql数据库的同步问题
〖作者:
tsingson|类型:
转载|收录:
2005-09-0618:
11:
30|浏览:
1689次〗
〖来源:
中国Perl协会〗〖讨论〗〖收藏到VIVI〗
【】减小字体增大字体(双击滚屏,单击停止)
本页地址:
6MySQL同步
同步功能在MySQL3.23.15就开始引进了,它可以把一个MySQL服务器上的数据复制到另一个服务器上去。
本章描述了MySQL的各种复制特性。
介绍了同步的概念,如何设置同步服务器,以及可用服务器的参照。
还提供了一系列的常见问题及其答案,疑难解答。
"14.6ReplicationStatements"中介绍了同步相关的SQL语句语法。
我们建议经常访问""经常阅读本章的最新内容。
同步功能一直在改进,我们经常把这部分的手册更新到当前的最新内容。
6.1同步介绍
MySQL3.23.15及更新的版本支持单向同步。
一个服务器作为master(主服务器),一个或者多个服务器作为slave(从服务器)。
master服务器把更新的内容写到二进制日志(binarylog或binlog)中,并且维护了一个索引文件来记录日志循环的情况。
这些日志中的更新部分会被发送到slave服务器。
一个slave连接到master之后,它通知master最后一次成功增量更新的日志位置。
slave会找出所有从那个时刻开始的更新操作,然后阻塞并等待master发送新的更新操作。
如果想要做一个同步服务器链的话,slave同时也可以作为master。
注意,启用同步后,所有要同步的更新操作都必须在master上执行。
否则,必须注意不要造成用户在master上的更新和在slave上的更新引起冲突。
单向同步的好处是稳健,高速,系统易管理:
有了master/slave机制后,就更稳健了。
当master上发生问题时,可以把slave作为备用切换过去。
可以在slave和master之间分担一些查询,这就能加速响应时间。
SELECT查询就可以在slave上执行以减少master的负载。
更新数据的语句则要放在mater上执行以保持master和slave的同步。
当非更新操作占多数时,负载均衡就很有效了,不过这只是普通情况而言。
另一个好处是可以在slave上备份数据,无需干扰master。
备份数据时master照样继续运作。
详情请看"5.7.1DatabaseBackups"。
6.2同步机制实现概述
MySQL同步机制基于master把所有对数据库的更新操作(更新、删除等)都记录在二进制日志里。
因此,想要启用同步机制,在master就必须启用二进制日志。
详情请看"5.9.4TheBinaryLog"。
每个slave接受来自master上在二进制日志中记录的更新操作,因此在slave上执行了这个操作的一个拷贝。
应该非常重要地意识到,二进制日志只是从启用二进制日志开始的时刻才记录更新操作的。
所有的slave必须在启用二进制日志时把master上已经存在的数据拷贝过来。
如果运行同步时slave上的数据和master上启用二进制日志时的数据不一致的话,那么slave同步就会失败。
把master上的数据拷贝过来的方法之一实在slave上执行LOADDATAFROMMASTER语句。
不过要注意,LOADDATAFROMMASTER是从MySQL4.0.0之后才开始可以用的,而且只支持master上的MyISAM类型表。
同样地,这个操作需要一个全局的读锁,这样的话传送日志到slave的时候在master上就不会有更新操作了。
当实现了锁自由表热备份时(在MySQL5.0中),全局读锁就没必要了。
由于有这些限制,因此我们建议只在master上相关数据比较小的时候才执行LOADDATAFROMMASTER语句,或者在master上允许一个长时间的读锁。
由于每个系统之间LOADDATAFROMMASTER的速度各不一样,一个比较好的衡量规则是每秒能拷贝1MB数据。
这只是的粗略的估计,不过master和slave都是奔腾700MHz的机器且用100MBit/s网络连接时就能达到这个速度了。
slave上已经完整拷贝master数据后,就可以连接到master上然后等待处理更新了。
如果master当机或者slave连接断开,slave会定期尝试连接到master上直到能重连并且等待更新。
重试的时间间隔由--master-connect-retry选项来控制,它的默认值是60秒。
每个slave都记录了它关闭时的日志位置。
msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。
6.3同步实现细节
MySQL同步功能由3个线程(master上1个,slave上2个)来实现。
执行STARTSLAVE语句后,slave就创建一个I/O线程。
I/O线程连接到master上,并请求master发送二进制日志中的语句。
master创建一个线程来把日志的内容发送到slave上。
这个线程在master上执行SHOWPROCESSLIST语句后的结果中的BinlogDump线程便是。
slave上的I/O线程读取master的BinlogDump线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relaylogs)中。
第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。
如上所述,每个mster/slave上都有3个线程。
每个master上有多个线程,它为每个slave连接都创建一个线程,每个slave只有I/O和SQL线程。
在MySQL4.0.2以前,同步只需2个线程(master和slave各一个)。
slave上的I/O和SQL线程合并成一个了,它不使用中继日志。
slave上使用2个线程的优点是,把读日志和执行分开成2个独立的任务。
执行任务如果慢的话,读日志任务不会跟着慢下来。
例如,如果slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几个小时。
如果slave在SQL线程没全部执行完就停止了,不过I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。
这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。
执行SHOWPROCESSLIST语句就会告诉我们所关心的master和slave上发生的情况。
下例说明了SHOWPROCESSLIST结果中的3个线程是什么样的。
这是在MySQL4.0.15及更新上执行SHOWPROCESSLIST的结果,State字段的内容已经比旧版本显示的更有意义了。
在master上,SHOWPROCESSLIST的结果如下:
mysql>SHOWPROCESSLIST\G
***************************1.row***************************
Id:
2
User:
root
Host:
localhost:
32931
db:
NULL
Command:
BinlogDump
Time:
94
State:
Hassentallbinlogtoslave;waitingforbinlogto
beupdated
Info:
NULL
在这里,线程2是为一个slave连接创建的。
结果表明所有未完成的更新日志已经都发送到slave了,master正等待新的更新日志发生。
在slave上,SHOWPROCESSLIST的结果如下:
mysql>SHOWPROCESSLIST\G
***************************1.row***************************
Id:
10
User:
systemuser
Host:
db:
NULL
Command:
Connect
Time:
11
State:
Waitingformastertosendevent
Info:
NULL
***************************2.row***************************
Id:
11
User:
systemuser
Host:
db:
NULL
Command:
Connect
Time:
11
State:
Hasreadallrelaylog;waitingfortheslaveI/O
threadtoupdateit
Info:
NULL
这表明线程10是I/O线程,它正连接到master上;线程11是SQL线程,它执行中继日志中的更新操作。
现在,这2个线程都处于空闲状态,正等待新的更新日志。
注意,Time字段的值告诉我们slave上的日志比master晚了多久。
详情请看"6.9ReplicationFAQ"。
6.3.1Master同步线程状态
以下列出了master的BinlogDump线程State字段中最常见的几种状态。
如果在master上没有BinlogDump线程,那么同步就没有在运行。
也就是说,没有slave连接上来。
Sendingbinlogeventtoslave
事件是由二进制日志构成,一个事件通常由更新语句加上其他信息。
线程读取到一个事件并正发送到slave上。
Finishedreadingonebinlog;switchingtonextbinlog
读取完了一个二进制日志,正切换到下一个。
Hassentallbinlogtoslave;waitingforbinlogtobeupdated
已经读取完全部未完成更新日志,并且全部都发送到slave了。
它处于空闲状态,正等待在master上执行新的更新操作以在二进制日志中产生新的事件,然后读取它们。
Waitingtofinalizetermination
当前线程停止了,这个时间很短。
6.3.2Slave的I/O线程状态
以下列出了slave的I/O线程State字段中最常见的几种状态。
从MySQL4.1.1开始,这个状态在执行SHOWSLAVESTATUS语句结果的Slave_IO_State字段也会出现。
这意味着可以只执行SHOWSLAVESTATUS语句就能了解到更多的信息。
Connectingtomaster
该线程证尝试连接到master上。
Checkingmasterversion
确定连接到master后出现的一个短暂的状态。
Registeringslaveonmaster
确定连接到master后出现的一个短暂的状态。
Requestingbinlogdump
确定连接到master后出现的一个短暂的状态。
该线程向master发送一个请求,告诉它要请求的二进制文件以及开始位置。
Waitingtoreconnectafterafailedbinlogdumprequest
如果二进制日志转储(binarylogdump)请求失败了(由于连接断开),该线程在休眠时进入这个状态,并定期重连。
重连的时间间隔由
--master-connect-retry选项来指定。
Reconnectingafterafailedbinlogdumprequest
该线程正尝试重连到master。
Waitingformastertosendevent
已经连接到master,正等待它发送二进制日志。
如果master闲置时,这个状态可能会持续较长时间,如果它等待超过slave_read_timeout秒,就会发生超时。
这时,它就会考虑断开连接,然后尝试重连。
Queueingmastereventtotherelaylog
已经读取到一个事件,正把它拷贝到中继日志中以备SQL线程处理。
Waitingtoreconnectafterafailedmastereventread
读日志时发生错误(由于连接断开)。
该线程在重连之前休眠master-connect-retry秒。
Reconnectingafterafailedmastereventread
正尝试重连到master。
当连接确定后,状态就变成Waitingformastertosendevent。
WaitingfortheslaveSQLthreadtofreeenoughrelaylogspace
relay_log_space_limit的值非零,中继日志的大小总和超过这个值了。
I/O线程等待SQL线程先处理中继日志然后删除它们以释放足够的空间。
Waitingforslavemutexonexit
当前线程停止了,这个时间很短。
6.3.3Slave的SQL线程状态
以下列出了slave的SQL线程State字段中最常见的几种状态:
Readingeventfromtherelaylog
从中继日志里读到一个事件以备执行。
Hasreadallrelaylog;waitingfortheslaveI/Othreadtoupdateit
已经处理完中继日志中的全部事件了,正等待I/O线程写入更新的日志。
Waitingforslavemutexonexit
当前线程停止了,这个时间很短。
SQL线程的State字段有时候也可能是一个SQL语句。
这意味着它从中继日志中读取到一个事件了,从中提取出SQL语句,并执行它。
6.3.4中继日志及状态文件
默认地,中继日志的名字格式为`host_name-relay-bin.nnn`,host_name是服务器的主机名,nnn是序号。
中继日志是根据顺序的序号来创建的,从000001(MySQL4.0及更旧是001)开始。
slave上用一个索引文件来跟踪当前正在使用的中继日志。
默认的中继日志索引文件名是`host_name-relay-bin.index`。
默认地,这个文件位于slave的数据文件目录下。
默认文件名可以根据的系统选项--relay-log和--relay-log-index来替换。
详情请看"6.8ReplicationStartupOptions"。
中继日志和二进制日志的格式一样,因此也可以用mysqlbinlog来读取。
当SQL线程读取完中继日志中的全部时间后就不再需要它了,会自动删除它。
中继日志没有显式的删除机制,因为SQL线程会关注这个。
不过,从MySQL4.0.14开始,执行FLUSHLOGS的话就会循环中继日志,会让SQL线程删除它们。
在下列条件中会创建一个新的中继日志:
slave启动后,I/O线程第一次启动(在MySQL5.0中,每次I/O线程启动后都会新建一个中继日志,而不只是第一次启动时)。
刷新日志时;例如,执行FLUSHLOGS语句或运行mysqladminflush-logs命令(从MySQL4.0.14开始才会创建新中继日志)。
当前的中继日志大小太大了;&quo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 设置 MySQL 同步 Replication