- 前提:分别使用上述安装脚本安装MySQL主从服务器,具体环境如下:
- 主(10.1.1.91),从(10.1.1.78)
- MySQL版本5.1.50,主从版本最好一致。
- 涉及到的相关配置文件变更my.cnf,selinux,iptables
- (后两者属于附加项,如果已经做了可以省略)
- |------| |-----|
- |Master|-------|Slave|
- |------| |-----|
- 10.1.1.91 10.1.1.78
- A.
- 10.1.1.91-主服务需要修改内容:(并重启启动mysql)
- #vim /etc/my.cnf
- #my.snf这个文件在安装过程中已经拷贝到/etc目录下,
- #如果没有请进之前mysql源码包解压目录的support-files/目录下进行拷贝,
- #在support-files/的目录下并不是同名文件,此目录下有my-small.cnf,my-large.cnf等,可以根据需求拷贝到/etc目录下
- [client]
- port = 3306
- socket = /usr/local/mysql/tmp/mysql.sock
- [mysqld]
- port = 3306
- socket = /usr/local/mysql/tmp/mysql.sock
- skip-external-locking #不使用系统锁定,要使用myisamchk,必须关闭服务器
- key_buffer_size = 256M
- max_allowed_packet = 1M
- table_open_cache = 256
- sort_buffer_size = 1M
- read_buffer_size = 1M
- read_rnd_buffer_size = 4M
- myisam_sort_buffer_size = 64M
- thread_cache_size = 8
- query_cache_size= 16M
- thread_concurrency = 8
- ########如下为添加项########
- log-bin=/data/dbdata/mysql-bin #开启mysql二进制日志
- binlog-do-db=test #这里只记录test库的二进制日志
- sync_binlog=1 #设置binlog有更新时刷新到磁盘
- binlog_format=mixed #设置binlog的复制模式为mixed(statement,row)
- #1. Row
- #日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。
- #2. Statement
- #每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
- #3.Mixed取1-2两者之间
- server-id = 1 #设置mysql_id(这个为主,从的可以是2,3,4.....)
- ############################
- [mysqldump]
- quick
- max_allowed_packet = 16M
- [mysql]
- no-auto-rehash
- [myisamchk]
- key_buffer_size = 128M
- sort_buffer_size = 128M
- read_buffer = 2M
- write_buffer = 2M
- [mysqlhotcopy]
- interactive-timeout
- #保存退出,重新启动Mysql
- #servier mysqld restart or /etc/init.d/mysqld restart or /usr/local/mysql/bin/mysqld start
- B.
- 登录10.1.1.91-主服务器上进行帐号授权(创建一个负责同步的帐号,严格意义上需要控制好权限),这边测试授予replication slave权限
- #mysql -uroot -p123456
- #mysql>grant replication slave on *.* to 'replication'@'10.1.1.78' identified by '123456'; (授权replication帐号(此帐号可以自行变更,切记勿忘)为replication slave权限)
- #mysql>flush privileges;(刷新权限列表)
- #mysql>flush tables with read lock;(设置读锁定有效-确保没有数据库操作,便于获得一个一致性的快照)
- #mysql>show master status;(出现类似如下表)
- +------------------+----------+
- | File | Position |
- +------------------+----------+
- | mysql-bin.000018 | 106 |
- +------------------+----------+
- 1 row in set (0.00 sec)
- #注意记录好'File'跟'Position'
- C.
- 导出数据10.1.1.91主服务器中需要同步的数据,导入到10.1.1.78从服务中
- #mysqldump -uroot -p123456 -l test >test.sql(记住导出的路径)
- 我这里通过sftp将数据拷贝到10.1.1.91上
- #sftp 10.1.1.78
- sftp>put test.sql(将test.sql上传至10.1.1.78,如果数据大的话可以使用其他工具进行拷贝),确定上传成功exit退出
- D.
- 确认主服务器数据库备份成功,恢复主数据库写的操作
- #mysql -uroot -p123456
- #mysql>unlock tables;
- E.
- 10.1.1.78-从服务器需要修改的内容:
- #vim /etc/my.cnf(关于my.cnf文件在主服务器上有说明)
- [client]
- port = 3306
- socket = /usr/local/mysql/tmp/mysql.sock
- [mysqld]
- port = 3306
- socket = /usr/local/mysql/tmp/mysql.sock
- skip-external-locking #不使用系统锁定,要使用myisamchk,必须关闭服务器
- key_buffer_size = 256M
- max_allowed_packet = 1M
- table_open_cache = 256
- sort_buffer_size = 1M
- read_buffer_size = 1M
- read_rnd_buffer_size = 4M
- myisam_sort_buffer_size = 64M
- thread_cache_size = 8
- query_cache_size= 16M
- thread_concurrency = 8
- #############添加修改内容如下#####
- #log-bin=mysql-bin
- binlog_format=mixed #设置binlog的复制模式为mixed
- server-id = 2 #设置server-id为2,这里表示从服务器
- replicate-do-db=test #只同步test库
- log-slave-updates #同步后记录二进制日志
- sync_binlog=1 #每经过1次日志写操作就把日志文件写入硬盘一次
- slave-net-timeout=60 #slave连接超时60s
- skip_slave_start=1
- ################################
- [mysqldump]
- quick
- max_allowed_packet = 16M
- [mysql]
- no-auto-rehash
- [myisamchk]
- key_buffer_size = 128M
- sort_buffer_size = 128M
- read_buffer = 2M
- write_buffer = 2M
- [mysqlhotcopy]
- interactive-timeout
- #保存退出,重新启动Mysql
- #servier mysqld restart or /etc/init.d/mysqld restart or /usr/local/mysql/bin/mysqld start
- F.
- 刚刚步骤B中提到的'File'跟'Position',在这里起作用了
- 登录从服务器(10.1.1.78)
- #mysql -uroot -p123456
- #mysql>change master to master_host='10.1.1.91',master_user='replication',master_password='123456',master_log_file='mysql-bin.000018',master_log_pos=106;
- #确保上述master_log_file和master_log_pos,跟刚刚记录的File,Position一致
- #start slave;(启动slave)
- #show slave status\G(出现如下信息,表示成功)
- -------------------------------------------
- Master_Host: 10.1.1.91 #主服务器IP
- Master_User: replication #授权帐号
- Master_Port: 3306 #主服务器端口
- Connect_Retry: 60 #连接重试60s
- Master_Log_File: mysql-bin.000018 #主服务器的binlog文件
- Read_Master_Log_Pos: 106 #同步读取二进制日志位置
- Relay_Log_File: s-relay-bin.000003
- Relay_Log_Pos: 251
- Relay_Master_Log_File: mysql-bin.000018
- Slave_IO_Running: Yes #正常情况必须为YES
- Slave_SQL_Running: Yes #正常情况必须为YES
- Replicate_Do_DB: test #同步的数据库是'test'
- -------------------------------------------
- #证实同步,请在主服务器上的test库中创建相关列表
问题集锦:
1.在执行主从同步change master的时候出现
“ ERROR 1201 (HY000): Could not initialize master!”原因:之前数据库做过主从 解决办法:
mysql>stop slave;
mysql>reset slave;(这个步骤重要)
mysql>change master to master_host='10.1.1.91',master_user='replication',master_password='123456',master_log_file='mysql-bin.000018',master_log_pos=106;
mysql>start slave;
mysql>show slave status\G
问题解决2.出现
MySQL manager or server PID file could not be found! [FAILED]
Starting MySQL.Manager of pid-file quit without updating fi[FAILED]
解决办法:
A-1.请确认/data/dbdata目录下面是否有之前安装残留的文件,将其rm掉;
A-2.rm掉残留文件,再rm掉/usr/local/mysql/tmp/mysql.sock,这个在启动的时候会提示连接不上这个;
A-3.确认my.cnf文件拷贝正确,mysql存储目录的权限/data/dbdata隶属与mysql:mysql;
A-4.确认SElinux关闭,检查是有有其他程序使用3306端口;
A-5.确定上述步骤检测OK,重新/usr/local/mysql/bin/mysql_install_db --user=mysql &
A-6.再次启动Mysqld(service mysqld restart)/etc/init.d/mysqld start3.如果是在Ubuntu下使用Mysql,默认情况下是拒绝远程登录的,这里我们需要修改如下配置,重启Mysql服务
配置文件的修改,my.cnf的存放路径请根据自己实际安装的进行查看,若不知可以使用find / -name my.cnf查看,后者自行找其他方法
#sudo vim /etc/mysql/my.conf
找到 bind-address = 127.0.0.1 登录mysql添加用户并且授权用户允许远程连接
mysql>grant all on *.* 'root'@'%' identified by '123456';
mysql>flush privileges;上面两句命令的意思是允许使用root帐号远程登录,并授予所有权限,并且刷新权限表,在真实环境下请注意用户对表的控制权限,我这边只是方便测试使用
4.系统时间不一致导致同步不成功
主从两端分别执行date命令查看,时间是否一致,若不一致请修改.