mysql主从复制

1420阅读 0评论2014-10-06 gagagixi
分类:LINUX

安装Mysql:
先将软件包放在Linux服务器上/usr/local/src/mysql下
其中包含:mysql-5.1.45.tar.gz
 
l 解压软件包
       # cd /usr/local/src/mysqlncurses
       # tar xzvf mysql-5.1.45.tar.gz
 
l 编译安装源码mysql
 
       # groupadd mysql
       # useradd -g mysql mysql
       # cd mysql-5.1.45
     #./configure --prefix=/usr/local/mysql --enable-local-infile  --with-charset=utf8  --with-extra-charsets=all --enable-thread-safe-client  --enable-assembler --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock --with-plugins=innobase
 
编译参数解释:
       -------------------------------------------------------------
       --prefix=/usr/local/mysql               //指定安装位置
--enable-local-infile                  //支持本地数据
--with-charset=utf8                    //默认安装字符集
--with-extra-charsets=all            //添加多语言支持
--enable-thread-safe-client          //安全线程链接
--enable-assembler                   //一些字符串使用汇编语言版本
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock  //使unix套接字链接提高7.5%性能
--with-plugins=innobase          //安装innodb引擎
--------------------------------------------------------
 
 
       # make
       # make install
 
l 配置mysql
# cp support-files/my-medium.cnf /etc/my.cnf
# 修改 /etc.my.cnf  将skip-locking替换成skip-external-locking
# cd /usr/local/mysql
# bin/mysql_install_db --user=mysql
# mkdir tmp
# chown -R root  .
# chown -R mysql var
# chown -R mysql tmp
# chgrp -R mysql .
#cp /usr/local/src/mysql-5.1.45/support-files/mysql.server /etc/init.d/
#cd /etc/init.d
#chmod 755 mysql.server
#./mysql.server start
#chkconfig --add mysql.server[加入启动级别]
#chkconfig --level mysql.server 345 on[加入启动等级]
 l 同样步骤在slave机器上安装完毕mysql
配置Mysql主从单向复制:
l 配置master mysql
 
# vim /etc/my.cnf
[mysqld]段添加:
---------------------------------------------------------------
server-id=1            # server-id 是主机的标识,确定其为整数并且唯一,一般设置为 1 。
 
log-bin=mysql-bin
 
#binlog-do-db=testdb    # 指定需要备份的数据库,多个写多行
#read-only=0           # 主机读写都可以 
---------------------------------------------------------------
:wq!
 
配置文件修改完毕保存该配置并且删掉 mysql 的 data 目录下除数据库以外的文件。主要是 *.00000* 类似的文件以及 master.info ,为避免出错,一定要先删除。
 
l 配置slave mysql
# vim /etc/my.cnf
[mysqld]段添加:
---------------------------------------------------------------
server-id = 2                   # 是从机的标识,确定其为整数并且唯一,一般设定为 2 ;
master-host=192.168.0.119      # 指主机 master 的 IP 地址; 
master-user=xp                 # 是指用于同步的帐号;
master-password=1234           # 是指同步帐号的密码;
master-port=3306               # 是指同步的两台 MySQL 服务器使用的端口号,默认为 3306
master-connect-retry=60        # 从服务器发现主服务器断掉,重新连接的时间差 ( 秒 )
replicate-do-db=testdb         # 指定要同步的数据库,有多个就写多行。
---------------------------------------------------------------
wq!
 
 
配置文件修改完毕保存该配置并且删掉 mysql 的 data 目录下除数据库以外的文件。主要是 *.00000* 类似的文件以及 master.info ,为避免出错,一定要先删除。
 
 
 
l 创建要备份的数据库(主机创建要同步数据库和表,从机不用)
 
主机上:
# /usr/local/mysql/bin/mysql -uroot 
mysql>create database testdb;
mysql>use testdb;
mysql>CREATE TABLE students(
 sn INT,
 name  VARCHAR(20)
 )
 
mysql>insert into students values(01,’xupeng’);
 
从机上:
# /usr/local/mysql/bin/mysql -uroot 
mysql>create database testdb;
mysql>CREATE TABLE students(
 sn INT,
 name  VARCHAR(20)
 )
 
 
l 创建用于同步的用户并赋予其操作权限(主机从机都要执行)
 
# /usr/local/mysql/bin/mysql -uroot 
mysql>GRANT REPLICATION SLAVE ON *.* TO 'xp'@'%' IDENTIFIED BY '1234'; 
 
语句解释: 
grant           是赋予权限的关键字 
replication     操作数据库权限:互相复制的权限
*.*             指的是 MySQL 服务器中所有的数据库下所有数据表,在此如果只需要同步数据库 testdb 下的所有表,可将其修改为 testdb.* 。
 
xp              是用于同步的帐号,其密码为 1234 。
 
% 表示的是所有 IP 地址,为了安全也可以指定某个 IP 地址,主机上写从机的 IP:192.168.0.119 ,从机上写主机的 IP 地址: 192.168.0.120
 
 
mysql> flush privileges;
 
 
l 测试同步状态
 
配置完毕后,重启服务。然后执行如下命令测
试同步状态: 
 
主机 master : 
mysql > show master status; 
记住字段 file 和 position 的值,在 slave 状态中需要检验的。 
 
从机 slave : 
mysql > show slave status\G; 

特别提示:检查参数 Slave_IO_State 、 Slave_IO_Running 、 Slave_SQL_Running 
Slave_IO_State 的状态值是由 Slave_IO_Running 的值决定的,如果
Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes ,并且
Slave_IO_State 的值为 :Waiting for master to send event ,那么说
明配置是没问题的可以进行下一步同步尝试了。
 
最后如果看到Slave的testdb.studens中有刚才在Master中
insert的数据则表示同步成功!
 
配置Mysql主从双向复制:
l 配置master mysql
 
# vim /etc/my.cnf
[mysqld]段添加:
---------------------------------------------------------------
server-id=1            # server-id 是主机的标识,确定其为整数并且唯一,一般设置为 1 。
 
log-bin=mysql-bin
master-host=192.168.0.120      # 指主机 master 的 IP 地址; 
master-user=xp                 # 是指用于同步的帐号;
master-password=1234           # 是指同步帐号的密码;
master-port=3306               # 是指同步的两台 MySQL 服务器使用的端口号,默认为 3306
master-connect-retry=60        # 从服务器发现主服务器断掉,重新连接的时间差 ( 秒 )
replicate-do-db=testdb         # 指定要同步的数据库,有多个就写多行。
#binlog-do-db=testdb    # 指定需要备份的数据库,多个写多行
#read-only=0           # 主机读写都可以  
---------------------------------------------------------------
:wq!
 
 
 
配置文件修改完毕保存该配置并且删掉 mysql 的 data 目录下除数据库以外的文件。主要是 *.00000* 类似的文件以及 master.info ,为避免出错,一定要先删除。
 
l 配置slave mysql
# vim /etc/my.cnf
[mysqld]段添加:
---------------------------------------------------------------
server-id = 2                   # 是从机的标识,确定其为整数并且唯一,一般设定为 2 ;
master-host=192.168.0.119      # 指主机 master 的 IP 地址; 
master-user=xp                 # 是指用于同步的帐号;
master-password=1234           # 是指同步帐号的密码;
master-port=3306               # 是指同步的两台 MySQL 服务器使用的端口号,默认为 3306
master-connect-retry=60        # 从服务器发现主服务器断掉,重新连接的时间差 ( 秒 )
replicate-do-db=testdb         # 指定要同步的数据库,有多个就写多行。
log-bin=mysql-bin
---------------------------------------------------------------
wq!
 
 
配置文件修改完毕保存该配置并且删掉 mysql 的 data 目录下除数据库以外的文件。主要是 *.00000* 类似的文件以及 master.info ,为避免出错,一定要先删除。
 
 
 
l 创建要备份的数据库(主机创建要同步数据库和表,从机不用)
 
主机上:
# /usr/local/mysql/bin/mysql -uroot 
mysql>create database testdb;
mysql>use testdb;
mysql>CREATE TABLE students(
 sn INT,
 name  VARCHAR(20)
 )
 
mysql> insert into students values(01,'xupeng');
 
从机上:
# /usr/local/mysql/bin/mysql -uroot 
mysql>create database testdb;
mysql>CREATE TABLE students(
 sn INT,
 name  VARCHAR(20)
 )
 
mysql> insert into students values(02,'xp');
l 创建用于同步的用户并赋予其操作权限(主机从机都要执行)
 
# /usr/local/mysql/bin/mysql -uroot 
mysql>GRANT REPLICATION SLAVE ON *.* TO 'xp'@'%' IDENTIFIED BY '1234'; 
 
语句解释: 
grant           是赋予权限的关键字 
replication     操作数据库权限:互相复制的权限
*.*             指的是 MySQL 服务器中所有的数据库下所有数据表,在此如果只需要同步数据库 testdb 下的所有表,可将其修改为 testdb.* 。
 
xp              是用于同步的帐号,其密码为 1234 。
% 表示的是所有 IP 地址,为了安全也可以指定某个 IP 地址,主机上写从机的 IP:192.168.0.119 ,从机上写主机的 IP 地址: 192.168.0.120
mysql> flush privileges;
l 测试同步状态
配置完毕后,主从分别重启服务  
 
主机 master : 
mysql > show master status; 
记住字段 file 和 position 的值,在 slave 状态中需要检验的。 
 
从机 slave : 
mysql > show slave status\G; 

特别提示:检查参数 Slave_IO_State 、 Slave_IO_Running 、 Slave_SQL_Running 
Slave_IO_State 的状态值是由 Slave_IO_Running 的值决定的,如果
Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes ,并且
Slave_IO_State 的值为 :Waiting for master to send event ,那么说
明配置是没问题的可以进行下一步同步尝试了。
 
最后如果看到Slave的testdb.studens中有刚才在Master中
insert的用户xupeng,并且Master中的testdb.studens中有刚才在Slave中
插入的用户xp则表示双向同步成功!
 
问题要点及其解决办法 
 
1.IP 变化导致数据不能同步问题 
 
有时候在同步中,你会发现头一天同步正常,而第二天数据并没有同步的情况,这时就需要确认一下主从机的 IP 地址是否发生了变化。如果已经变更,则需要修改配置文件,并且删除 master.info 和 relay-log.info 之后重启服务。 
 
 
2. 配置之后在查看 slave 状态时,三个关键参数值不对 
 
Slave_IO_Running:No ----- 复制没有启动,执行命令 slave start io_thread 尝试启动 io 线程 
 
Slave_SQL_Running:No ----- 执行命令 slave start sql_thread 
 
执行完后,如果状态值还是不对,检查一下 master 中的 file 和 position 的值和 slave 状态中的 master_log_file 、 master_log_pos 的值分别是否对应。如果不对应 , 执行以下命令修改 slave 的状态值: 
mysql > stop slave; 
 
mysql> change master_log_file='mysql-bin.000001', master_log_pos=106;
 
如其他值也有问题,可在后面累加,以逗号隔开,命令结束时用分号结尾。
 
如果以上方法仍不能启动,则:
1.停止主,从机器的MYSQL服务. 
2.在服务全停的情况下,将主,从端的所有   bin.00*  -relay-bin.00*  master.info  relay-log.info都删除 
3.复制主机的/var/lib/mysql(或者说是你的数据库文件)到从机同样的位置(这一步很重要,我参考过官方网站,这一步其实就是一个数据库的SNAPSHOT数据快照,它要求用MYSQLDUMP生成个快照,但复制不是更省事吗:),相当于强制同步了一下) 
4.启动MASTER,SLAVE 
5.在从端mysql> SLAVE   START;


上一篇:hadoop cdh5安装
下一篇:将博客搬至CSDN