精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-12
一、试验环境CentOS release 5.5 64bit mysql5.0.90 A:主服务器主机名www.caimincun.com ip:192.168.1.203 B:从服务器主机名uc.caimincun.com ip:192.168.1.215 由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者Master的MySQL版本低于Slave的MySQL版本,Master的版本MySQL一定不能高于Slave的MySQL版本。 二、在主服务器和从服务器上为复制设置一个连接账户。该账户必须授予REPLICATION SLAVE权限和FILE权限。如果账户仅用于复制(推荐这样做),则不需要再授予任何其它权限。 /local/server/mysql/bin/mysql -u root -pzhcw123 mysql> GRANT REPLICATION SLAVE,FILE ON *.* TO slave@'192.168.1.%'IDENTIFIED BY '123456';(这样授权可能开启同步的时候Slave_IO_Running可能为no,如果是测试环境,建议用下面的方法 mysql>grant all PRIVILEGES on *.* to slave@'192.168.1.%' identified by '123456'; 主mysql和从mysql都要执行上面的语句 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | dbcenter | | mysql | | test | | uchome | | zhcw | +--------------------+ 主mysql创建需要复制的数据库AB mysql> create database AB;(为了实验方便,只建库不建表) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | AB | | dbcenter | | mysql | | test | | uchome | | zhcw | +--------------------+ mysql> Flush privileges; 修改 主服务器上的my.cnf 文件 vi /etc/my.cnf 在 # Replication Master Server (default) # binary logging is required for replication 下添加 注释掉#server-id = 1 log-bin=mysql-bin # 启动二进制日志系统 server-id=1 # 本机数据库ID 标示为主服务器 binlog-do-db=AB # 二进制需要同步的数据库名 binlog-ignore-db=mysql # 避免同步mysql用户配置,以免不必要的麻烦如果多个数据库不需要同步,建议重复使用次参数,如binlog-ignore-db=mysql binlog-ignore-db=test,不建议binlog-ignore-db=mysql,test的方法 master-host = 192.168.1.215 # 指定主服务器IP地址 master-user = slave #指定在主服务器上可以进行同步的用户名 master-password = 123456 #密码 master-port = 3306 #同步所用端口 master-connect-retry = 60 #断点从新连接时间 replicate-ignore-db = mysql #屏蔽对mysql库的同步 replicate-do-db = AB #同步的数据库的名称 如果要同步的数据库有数据,需要执行FLUSH TABLES WITH READ LOCK语句清空内存中所有表和块写入磁盘并锁住表, 并将本地需要同步数据库打包拷贝到从数据库上 mysql> FLUSH TABLES WITH READ LOCK; 然后将要复制的数据库的信息拷贝到远程主机上 scp –r /local/data/mysql/AB 192.168.1.215:/data/mysql // 对主服务器进行解锁 mysql> UNLOCK TABLES // 关闭mysql服务 /local/server/mysql/bin/mysqladmin –u root –pzhcw123 shutdown 也可以用/etc/init.d/mysqld stop命令关闭mysql数据库 如果log-bin=/local/data/mysql路径下有日志,建议删除日志 rm –rf mysql-bin.* 启动mysql服务 /local/server/mysql/bin/mysqld_safe –user=mysql & 或者/etc/init.d/mysqld start 三、配置从服务器 创建同步的数据库AB mysql> create database AB;(为了实验方便,只建库不建表) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | AB | | dbcenter | | mysql | | test | | uchome | | zhcw | +--------------------+ mysql> Flush privileges; [root@uc mysql]# vi /etc/my.cnf 修改 my.cnf 文件,在 # Replication Master Server (default) # binary logging is required for replication 下添加 注释掉#server-id = 1 server-id=2 # 从服务器ID号,不要和主ID相同 master-host=192.168.1.203 # 指定主服务器IP地址 master-user=slave # 指定在主服务器上可以进行同步的用户名 master-password=123456 # 密码 master-port=3306 # 同步所用端口 master-connect-retry=60 # 断点从新连接时间 replicate-ignore-db=mysql # 屏蔽对mysql库的同步 replicate-do-db=AB # 同步的数据库的名称 binlog-do-db=AB # 二进制需要同步的数据库名 binlog-ignore-db=mysql # 避免同步mysql用户配置,以免不必要的麻烦如果多个数据库不需要同步,建议重复使用次参数,如binlog-ignore-db=mysql binlog-ignore-db=test,不建议binlog-ignore-db=mysql,test的方法 // 关闭mysql服务 /local/server/mysql/bin/mysqladmin –u root –pzhcw123 shutdown 或者/etc/init.d/mysqld stop 如果log-bin=/local/data/mysql路径下有日志,建议删除日志 rm –rf mysql-bin.* 启动mysql服务 /local/server/mysql/bin/mysqld_safe –user=mysql & 或者/etc/init.d/mysqld start 分别在两台mysql数据库查看master状态 /local/server/mysql/bin/mysql –u root –pzhcw123 mysql> show master status; +--------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------+----------+--------------+------------------+ | mysql.000001 | 98 | AB | mysql | +--------------+----------+--------------+------------------+ [root@uc mysql]# /local/server/mysql/bin/mysql -u root -pzhcw123 mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 98 | AB | mysql | +------------------+----------+--------------+------------------+ 可以看到同步使用的日志和Pos地址等信息 // 启动从服务器线程: 在两台mysql数据库分别执行 mysql> START SLAVE; 验证配置 通常情况下,mysql双向复制已经配置成功,但是有时候也会有一些问题 两天mysql数据库分别执行 mysql> show slave status; 如果Slave_IO_Running: Yes Slave_SQL_Running: Yes 证明同步成功,如果有一个状态为NO,则表示同步失败 通常解决方法为在从库停止同步 mysql> stop slave; mysql> CHANGE MASTER TO MASTER_LOG_FILE=' mysql.000001 ',MASTER_LOG_ POS=98; mysql> start slave; mysql> show slave status; 具体的MASTER_LOG_FILE和,MASTER_LOG_POS需要参考对应的主数据库show master status;查询出的信息。 如果Slave_IO_Running和Slave_SQL_Running仍然有状态为No的,请参考一下信息,找到原因并解决。 如果是slave_io_running no了,那么有三种情况,一个是网络有问题,连接不上,第二个是有可能my.cnf有问题,请仔细检查并修改配置文件,三是授权的问题,replication slave和file权限是必须的,很多情况下,出现Slave_IO_Running:NO的原因是slave上没有权限读master上的数据。一旦io为no了先看err日志,看看是什么错,很可能是网络,也有可能是包太大收不了,这个时候主备上改max_allowed_packet这个参数。 如果是slave_sql_running no了,那么也有两种可能,一是slave机器上这个表中出现了其他的写操作,二是slave进程重启,事务回滚造成的,这也是mysql的一种自我保护的措施,像关键时候只读一样。这种原因想恢复的话,只要停掉slave,set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;再开一下slave就可以了, mysql> stop slave; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave; 四、测试 // 在主服务器上建立一个表 mysql> use AB; mysql> create table test(id int,name varchar(20)); Query OK, 0 rows affected (0.20 sec)mysql> show tables; +--------------+ | Tables_in_AB | +--------------+ | test | mysql> insert into test values(1,'stream'); Query OK, 1 row affected (0.12 sec) mysql> insert into test values(2,'super'); Query OK, 1 row affected (0.00 sec) mysql> insert into test values(3,'merry'); Query OK, 1 row affected (0.01 sec) mysql> select * from test; +------+--------+ | id | name | +------+--------+ | 1 | stream | | 2 | super | | 3 | merry | +------+--------+ // 在从服务器上查询 mysql> use AB; mysql> show tables; +--------------+ | Tables_in_AB | +--------------+ | test | +--------------+ mysql> select * from test; +------+--------+ | id | name | +------+--------+ | 1 | stream | | 2 | super | | 3 | merry | +------+--------+ 在从mysql上建一张表 mysql> create table test1 as select * from test; mysql> select * from test1; +------+--------+ | id | name | +------+--------+ | 1 | stream | | 2 | super | | 3 | merry | +------+--------+ 在主mysql里查询 mysql> show tables;</s 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4297 次