程序猿微信Word格式文档下载.docx
《程序猿微信Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《程序猿微信Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
msater是不知道有多少个slave连接上来或者哪个slave从什么时候开始更新。
注:
启用同步后,所有要同步的更新操作都必须在master上执行。
否则,必须注意不要造成用户在master上的更新和在slave上的更新引起冲突。
1、同步实现步骤
步骤一:
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用它来读取中继日志,然后执行它们来更新数据。
可参见下图图示:
如上图所示:
每个master/slave上都有三个进程,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读取更新日志了。
2、在master/slave查看状态
在master上,执行下面的命令,可以看到运行状态
Mysq>
SHOWPROCESSLIST\G;
Mysql>
showmasterstatus\G;
在slave上,可以执行以下命令
showslavestatus\G;
3、中继日志及状态文件
中继日志
默认地,中继日志的名字格式为`host_name-relay-bin.nnn`,host_name是服务器的主机名,nnn是序号,如:
sumi2-relay-bin.000008。
索引中继日志
slave上用一个索引文件来跟踪当前正在使用的中继日志,这个文件的文件名是`host_name-relay-bin.index`,如:
sumi2-relay-bin.index。
在下列条件中会创建一个新的中继日志:
(1)slave启动后,I/O线程第一次启动(在MySQL5.0中,每次I/O线程启动后都会新建一个中继日志,而不只是第一次启动时)。
(2)刷新日志时;
例如,执行flushlogs语句或运行mysqladminflush-logs命令(从MySQL4.0.14开始才会创建新中继日志)。
(3)当前的中继日志大小太大了,“太大了”是这么判断的:
max_relay_log_size,如果max_relay_log_size>
0的话
max_binlog_size,如果max_relay_log_size=0或MySQL低于4.0.14
状态文件
状态文件,名字默认为`master.info`and`relay-log.info`。
slave关闭后,会保留他们。
当下一次slave启动时,就会读取这两个文件来判断从master读取到二进制日志的什么位置了,处理中继日志到什么位置了。
三、MySQL同步的设置
1、准备服务器
准备两台服务器192.168.0.32(master)和192.168.0.25(slave)。
两个MySQL的basedir目录都是/usr/local/mysql,数据存放路径/usr/local/mysq/data/。
创建数据库sumi_test1为同步数据库,添加用户sum为专用同步的用户。
Master的MySQL版本和Slave的版本相同或者更低,Master的版本一定不能高于Slave版本。
2、设置MASTER服务器
创建一个MySQL帐号为同步专用:
grantreplicationslave,reload,super,on*.*tosum@192.168.0.25identifiedby'
sum123'
;
FLUSHPRIVILEGES;
修改f文件
#cat/etc/f
然后,将sumi_test1数据库导出,并导入slave数据库中,在启动同步之前,两边的数据要一致。
3、设置Slave服务器
#vi/etc/f
4、查看同步状态
Master服务器
Mysql>
Slave服务器
四、同步数据方法
终于学会了王总的方法,进行数据同步,网上的方法是将master数据库文件拿过来,势必要终止往主数据库写入,可以参考:
但是这样从数据库们也不能使用了,王总的方法,可以不影响主数据库写入,从一个从数据库中将数据表拷贝到新slave服务器或问题服务器上来。
环境
Slave1数据库IP:
211.103.156.201hostname:
C
Slave2数据库IP:
211.103.156.203hostname:
步骤
1、先在新的slave上配置好mysql
配置方法见上面章节
2、停止slave数据库slaveIP:
211.103.156.201
#/usr/local/mysq/bin/mysqladmin-uroot-pshutdown
#cd/usr/local/mysql/var/
3、只拷贝需要同步的数据库(club)及需要的日志文件
#tar-zcvfclub.tar.gzclub
需要备份的日志文件
#tar-zcvfdaillog.tar.gzrelay-log.infoc2-relay-bin.indexc2-relay-bin.000122master.info
4、在slave2上解压数据库club及修改日志名
#tar-zxvfclub.tar.gz-C/usr/local/mysql/data/
#tar-zcvfdaillog.tar.gz-C/usr/local/mysql/data/
这里要查看一下本机的mysql配置中,relay-log的名字
#cd/usr/local/mysql/data/
#virelay-log.info
#mvc2-relay-bin.indexc6-relay-bin.index
#vivic6-relay-bin.index
#mvc2-relay-bin.000122c6-relay-bin.000122
5、启动新的slave服务器即可。
五、同步问题
1、出现错误提示
解决方法
从服务器上删除掉所有的二进制日志文件,包括一个数据目录下的master.info文件和hostname-relay-bin开头的文件。
master.info:
:
记录了Mysql主服务器上的日志文件和记录位置、连接的密码。
2、出现错误提示
解决方案:
由于主服务器运行了一段时间,产生了二进制文件,而slave是从log.000001开始读取的,删除主机二进制文件,包括log.index文件。
3、错误提示如下
由于slave没有此table表,添加这个表,使用slavestart就可以继续同步。
4、错误提示如下
Slavestatus\G;
显示:
Slave_SQL_Running为NO
解决方法:
stopslave;
setglobalsql_slave_skip_counter=1;
startslave;
5、错误提示如下
#showslavestatus\G;
这个问题原因是,主数据库突然停止或问题终止,更改了mysql-bin.xxx日志,slave服务器找不到这个文件,需要找到同步的点和日志文件,然后chagemaster即可。
要找到slave状态中,Relay_Master_Log_File和Exec_Master_Log_Pos的值即可。
参考:
问题总结
mysql>
showslavestatus\G
Slave_IO_Running:
Yes
Slave_SQL_Running:
No
解决办法一
Slave_SQL_Running:
No
1、程序可能在slave上进行了写操作
2、也可能是slave机器重起后,事务回滚造成的。
一般是事务回滚造成的:
解决办法:
slavestop;
setGLOBALSQL_SLAVE_SKIP_COUNTER=1;
slavestart;
解决办法二
首先停掉Slave服务:
slavestop
到主服务器上查看主机状态:
记录File和Position对应的值
进入master
showmasterstatus;
+----------------------+----------+--------------+------------------+
|File
|Position|Binlog_Do_DB|Binlog_Ignore_DB|
|localhost-bin.000094|33622483|
|
|
1rowinset(0.00sec)
然后到slave服务器上执行手动同步:
changemasterto
>
master_host='
master_ip'
master_user='
user'
master_password='
pwd'
master_port=3306,
master_log_file=’mysql-bin.000023’,
master_log_pos=33622483;
slave恢复正常,但数据并没有同步过来,需要手动同步。
先停止master的写操作,然后在slave上使用同步命令:
LOADDATAFROMMASTER;
3、通过二进制文件导入slave服务器进行数据同步
当slave同步master的二进制日志文件时突然终止,master数据库重启,会新建一个二进制日志。
原同步文件是mysql-bin.00025,重启后出错,生成mysql-bin.00026文件,调整好后,日志名为mysql-bin.00027,但26文件中也有写入操作。
Slave若要同步数据,这执行以下操作:
(1)在slave先恢复到27,执行下面语句
(2)在master将mysql-bin.00026二进制文件,导出为sql文件
#/usr/local/mysql/bin/mysqlbinlogmysql-bin.000025--start-position1010663046>
test25.sql
//--start-position1010663046可以选择起始节点,从哪个位置导出
#/usr/local/mysql/bin/mysqlbinlogmysql-bin.000026>
test26.sql
(3)在slave中,将导出的sql文件,导入到slave库中
错误1201
changemastertomaster_host='
IP'
master_user='
用户'
master_password='
密码'
master_log_file='
mysqld-bin.000044'
master_log_pos=564188871;
ERROR1201(HY000):
Couldnotinitializemasterinfostructure;
moreerrormessagescanbefoundintheMySQLerrorlog
1.进入MySQL数据库默认的数据库存储目录:
/usr/local/mysql/var
这个目录根据实际情况而定,使用不同的安装方式,或是编译指定目录不同,这个目录也不一定相同,但只要找到数据库的存储目录就好。
2.删除以下两个文件:
Master.inforelay-log.info
3.登陆数据库后,执行:
startslave;
返回如下信息:
QueryOK,0rowsaffected(0.00sec)
这样就说明问题已经解决了。