最近在学Linux 的应用技术
今天在虚拟机上尝试了MYSQL 数据库主从同步的实验,虽然事先百度了,看了别人的教程,但是自己在做的过程中还是出现了几个问题,在此记录下来,给需要的朋友借鉴一下,以后自己忘记了也可以回头看看。
两个虚拟机分别是:
Red Hat Enterprise Linux Server release 6.3 (Santiago) 192.168.1.251
Red Hat Enterprise Linux Server release 5.6 (Tikanga) 192.168.1.250
安装是之前装的,在此就不多说了,两个虚拟机都是同样的MYSQL的版本:
[[email protected] ~]# mysql -V
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i386) using readline 5.1
配置过程:
192.168.1.250 master的配置
vim /etc/my.cnf---打开配置文件,随便找个地方添加下面的内容
7 server-id=001
8 log-bin=mysql_log-----这个名字随便写一个
9 binlog-do-db=smpdb------数据库的名字,可以登录MYSQL数据库,用show databases;命令查看
10 binlog-do-db=student
11 binlog-do-db=example
12 binlog-do-db=test
13 binlog-ignore-db=mysql---不需要同步的数据库,根据自己的实际情况来设置
保存退出,重启:service mysqld restart
192.168.1.251 slave的配置
10 server-id=002-----这里的server-id一定不能和master的相同
11 log-bin=mysql_log----这里的名字不知道和master的不一样行不行,猜测应该可以的
12 master-host=192.168.1.250---指定master的IP
13 master-user=root------------指定用哪个用户登录master(这个用户必须是master存在的用户)
14 master-password=root--------指定密码
15 master-port=3306------------默认端口
保存退出,重启:service mysqld restart
登录slave的MYSQL数据库,用show slave status \G 命令,看到
Slave_IO_Running: NO
Slave_SQL_Running: Yes
要两个都是yes才成功,有一个NO,说明没成功。
下面开始查找原因:
------------------------------
ping 192.168.1.250(master IP )通了,在master 查看
[[email protected] ~]# netstat -an | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN tcp 0 0 192.168.1.250:3306 192.168.1.251:40598 TIMEWAIT
可以看到端口已经打开,但是连接状态并不是ESTABLISHED,说明连接有问题
登录master数据库
mysql> show master status \G
*************************** 1. row ***************************
File: mysql_log.000004
Position: 476
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
以为是selinux,又把selinux关闭
[[email protected] ~]# setenforce 0
还是不行,又以为是iptables
[[email protected] ~]# iptables -L
Chain INPUT (policy DROP)------默认规则把数据包丢掉
把iptables修改为默认ACCEPT
[[email protected] ~]# iptables -P INPUT ACCEPT
(顺便说一下这里,一开始记错命令iptables -P INPUT -j ACCEPT, 总是提示使用帮助,折腾了半个多小时,才发现是多用了-j参数,百度出来的全是叫人怎么使用ADC参数之类的,坑爹!)
再使用show slave status \G查看,错误依旧,于是查看日志记录(出错要记得经常看日志,最容易通过日志找问题)
[[email protected] ~]# tail /var/log/mysql.log
263 140720 13:39:06 [Note] Slave SQL thread initialized, starting replication in log ‘FIRS T‘ at position 0, relay log ‘./mysqld-relay-bin.000008‘ position: 4
264 140720 13:39:06 [Note] Event Scheduler: Loaded 0 events
265 140720 13:39:06 [Note] /usr/libexec/mysqld: ready for connections.
266 Version: ‘5.1.61-log‘ socket: ‘/var/lib/mysql/mysql.sock‘ port: 3306 Source distrib ution
267 140720 13:39:16 [ERROR] Slave I/O: error connecting to master ‘mysql@192.168.1.250:330 6‘ - retry-time: 60 retries: 86400, Error_code: 1045
说一下这里的[email protected]:一开始在slave里设置使用mysql账户和密码,后来出错,百度说可能是对数据库没有操作权限,因为master的数据库全部都是root用户的,所以后来改用了root账户和密码。
根据错误的第263行,有尝试了登录slave的MYSQL数据库,手动指定master
mysql>change master to
>master_host=‘192.168.1.250‘
>master_user=‘root‘
>master_password=‘123456‘
>master_log_file=‘mysql_log.00004‘
>master_pos=476;
最后两行的信息是在master登录MYSQL数据库用show master status \G 查看的。
再次查看,还是不行:
Slave_IO_Running: NO
Slave_SQL_Running: Yes
日志里依然是
[ERROR] Slave I/O: error connecting to master ‘[email protected]:330 6‘ - retry-time: 60 retries: 86400, Error_code: 1045
这样的错误
我好奇怪,我明明把用户都改为root了,而且重启了n次MYSQL服务,为什么还是mysql用户呢????
是不是哪里的缓存没清掉???但是不知道怎么清缓存,也不知道缓存在哪里
只好使用杀手锏:重启虚拟机!!!!
再次登录,OK了,两个YES
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.250
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_log.000004
Read_Master_Log_Pos: 476
Relay_Log_File: mysqld-relay-bin.000010
Relay_Log_Pos: 243
Relay_Master_Log_File: mysql_log.000004
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: 476
Relay_Log_Space: 914
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
---------------------------------------------------------
我以为就这样行了,等这它自动同步我设置好的数据库,等了很久都没有
奇怪,不是OK了吗?为什么没有同步的数据库呢?
于是,在slave里创建一个和master相同结构的test数据库,在master里对test添加表和数据,结构在slave的test里马上就有了,原来如此,只能同步建立好主从同步之后的对数据库的操作的数据!!!---其实到底是不是这样我还没有深究,这个结论只是根据自己的初步实验猜测的。
本人对linux技术也是刚入门,这是我的第一篇博客,错漏之处,敬请指出!!