全部博文(2065)
分类: Mysql/postgreSQL
2009-03-18 12:39:19
一,同步的原理:mysql主服务器运行进程,将表的写操作计入binlog,从服务器运行两个进程,其一,从主服务器取回数据binlog,另一个,运行其中的sql,使从服务器更新。
二,设置:(主机使用Freebsd ,mysql 4.1.20-standard-log ,从机使用windows xp 5.0.18-nt ,原则上要求主机从机系统,数据库系统版本一致,如果不一致,从机的数据库版本要高于主机)
1.主服务器:
(1)授权。GRANT REPLICATION SLAVE ON *.* TO IDENTIFIED BY "password"
意义:给从机授复制权限。如果需要LOAD TABLE FROM MASTER 和LOAD DATA FROM MASTER 需要授select、reload 和super 权限给此用户。
测试:在从机上用mysql -uuser -hhost -ppassword连接主机。
(2)关闭主控服务器(/usr/local/mysql/bin/mysql.server stop视系统不同而不同),记录binlog的filename和position。
(2-1)FLUSH TABLE WITH READ LOCK
(2-2)SHOW MASTER STATUS记录file栏和position栏
意义:记录binlog的filename和position。FLUSH TABLE WITH READ LOCK是因为mysql为了减少读写磁盘,会把部分binlog暂存到内存,到一定空间阀值一次性写入磁盘,这样做就是要求把这些binlog强制写到 磁盘。这步说实话有点问题,线上系统你敢关么?这个探讨一下,我试配的时候是这么做的。
意外处理:如果(2-2)出现空白,表明没有启用binlog。启用的方法是在my.cnf(*nix)或my.ini(win)中找到[mysqld] 加入log-bin=filename,或log-bin,后者采用机器名作为binlog的name。
(3)创建主服务器的快照。
有两种方法:
(3-1)进入mysql的数据文件夹,打包所有的数据文件夹,如果有INNODB的文件夹,还要把ibdata文件也打包。同时copy到各从机上。
(3-2) 使用mysqldump -uuser -ppassword --master-data 库名 表名>mastersql2slave.sql生成sql文件,如果需要所有库使用mysqldump -uuser -ppassword --master-data --all-databases>mastersql2slave.sql
意义:相当于给从机形成一个同步的起点。
(4)修改配置文件。
修改my.cnf(*nix)或my.ini(win)在[mysqld]加入server-id=1(保证此ID主从各服务器间唯一)
(5)启动主服务器(/usr/local/mysql/bin/mysql.server start视系统不同而不同)
2.从属服务器
(1)如果加入过同步设置的机器使用新配置先使用RESET SLAVE , 如果从数据库已有一些其他数据,最好把他们移到其他备份目录。把刚才的快照恢复之。*nix下注意权限和属主。
(2)修改配置文件my.cnf(*nix)或my.ini(win)
(2-1)找到[mysqld]加入server-id=2(保证此ID主从各服务器间唯一)
(2-2)如果只想做某一个库的主从同步,可以在[mysqld]段写上replicate-do-db=库名。
(3)运行master转向语句。
(3-1)如果同步正在进行,运行stop slave停止同步。
(3-2)按实际情况运行CHANGE MASTER TO MASTER_HOST = 'host_name',MASTER_USER = 'user_name', MASTER_PASSWORD = 'password', MASTER_PORT = port_num, MASTER_CONNECT_RETRY = count,MASTER_LOG_FILE = 'master_log_name',MASTER_LOG_POS = master_log_pos,RELAY_LOG_FILE = 'relay_log_name',RELAY_LOG_POS = relay_log_pos; 全部是可选项。遗漏则不变。MASTER_LOG_FILE ,MASTER_LOG_POS使用主服务器(2-2)步骤记下的数据。
(4)开启同步机制。start slave。
检查:
(4-1)从机上运行show slave status\G;
(4-2)如果:Slave_IO_Running: Yes并且Slave_SQL_Running: Yes则配置成功。如果不能同步,则有可能同步库名有问题。
(4-3)如果:Slave_IO_Running: No。则可能的原因是网络问题,binglog设置错误,host设置错误等等。
(4-4)如果:Slave_SQL_Running: No。则可能的原因是sql语句执行报错等等,有可能是主从数据库结构有问题。
(4-5) 如遇(4-3)或(4-4)问题,可在解决后运行start slave io_thread 或 start slave sql_thread 启动进程。直至(4-2)情况。
(4-6)此时在从机的mysql数据文件目录下应该有形如:
080910 19:39:41 [Note] Slave I/O thread: connected to master 'lgy@192.168.1.222:3306', replication started in log 'c402sx-bin.000122' at position 42738307
080910 19:39:41 [Note] Slave SQL thread initialized, starting replication in log 'c402sx-bin.000122' at position 23384516, relay log '.\liuguanyu-relay-bin.000002' position: 23631758
的记录记录如默认叫hostname.err的文件里。