快速笔记02-MySQL主从复制原理半同步操作步骤及原理
==========================================================一:MySQL主从复制规划 主库:(MySQLmaster)IP:10.0.0.52PROT:3306从库1:(MySQLslave)IP:10.0.0.52PORT:3307从库2:(MySQLslave)IP:10.0.0.52PORT:3308 ==========================================================二:检查环境(1)检查MySQL数据库多实例是否启动 netstat-lntup|grep330tcp000.0.0.0:33060.0.0.0:*LISTEN20434/mysqldtcp000.0.0.0:33070.0.0.0:*LISTEN15120/mysqldtcp000.0.0.0:33080.0.0.0:*LISTEN19578/mysqld (2)开启MySQL主库的Binlog功能 greplog-bin/data/3306/my.cnf (3)设置server-id,此处ID不可以相同否则最后出现IO错误 grepserver-id/data/{3306,3307,3308}/my.cnf/data/3306/my.cnf:server-id=1/data/3307/my.cnf:server-id=3/data/3308/my.cnf:server-id=8 ==========================================================三:因为从库现在还没有数据,或者数据不统一我们需要导入数据 wgetftp://10.0.0.1/backup-mysql-salt.tar.gztarxfbackup-mysql-salt.tar.gzzcat/root/bak_2016-07-27.sql.gz|mysql-uroot-poldboy-S/data/3306/mysql.sockmysql-uroot-poldboy-S/data/3306/mysql.sockshowdatabases;#检查数据库是否导入selectuser,hostfrommysql.user; ==========================================================四:主库上面的操作(3306)(1)主库需要授权slave访问的用户rep mysql-uroot-poldboy-S/data/3306/mysql.sock#登录第一个实例的MySQL数据库grantreplicationslaveon*.*to'rep'@'172.16.1.%'identifiedby'oldboy123';flushprivileges;showgrantsforrep@'172.16.1.%';#查看用户的权限selectuser,hostfrommysql.user; 提示:replication slave 为mysql同步的必须权限,此处不要授权all权限(2)锁表、查看binlog文件及位置点,主库导出全备,需要锁表(-x –master-date=2) flushtablewithreadlock;#锁表,窗口不能退出,退出失效showmasterstatus;#锁表后查看主库状态,临界点,将来恢复就从0004开始|mysql-bin.000004|600457||| (3)将MySQL主库的数据进行备份 mkdir/server/backup/-pmysqldump-uroot-poldboy123-S/data/3306/mysql.sock-A-B--events|gzip>/server/backup/rep3307_bak$(date+%F).sql.gz#由于之前导入的数据库为全量的所以以前的密码为oldboy123ls-lrt/server/backup/ (4)解锁MySQL数据库的数据表,并查看msater的状态 unlocktable;#解锁MySQL数据库的数据表showmasterstatus; 提示:如果解锁之后还是mysql-bin.000004 说明是正确的,如果动了说明没有锁住表提示:如果mysqldump 加了-F 他就会更改刷新binlog 五:从库1上面的操作(3307)提示:一定要确保从库的server_id与从库的不同 grepserver-id/data/{3306,3307}/my.cnf/data/3306/my.cnf:server-id=1/data/3307/my.cnf:server-id=3 (1)把主库的备份数据导入到从库 cd/server/backup/gzip-drep3307_bak2016-07-29.sql.gzmysql-uroot-poldboy-S/data/3307/mysql.sock<rep3307_bak2016-07-29.sql 提示从库的密码为oldboy(2)登录从库检查主库1查看数据是否导入成功 mysql-uroot-poldboy-S/data/3307/mysql.sockshowdatabases;selectuser,hostfrommysql.user; (3)刷新用户的权限 flushprivileges; (4)查找位置点,配置master.info,以下为主库的位置点 showmasterstatus;(主数据库执行此命令)|mysql-bin.000004|600457|||CHANGEMASTERTOMASTER_HOST='172.16.1.52',#这是主库的IP(域名也可以需要做解析)MASTER_PORT=3306,#主库的端口,从库端口和主库不可以相同MASTER_USER='rep',#这是主库上创建用来复制的用户repMASTER_PASSWORD='123456'#rep的密码MASTER_LOG_FILE='mysql-bin.000025',#这里是showmasterstatus时看到的查询二进制日志文件名称,这里不能多空格MASTER_LOG_POS=9155;#这里是showmasterstatus时看到的二进制日志偏移量,不能多空格 提示:3307操作此步:会在/data/3307/data下面产生master.info文件(5)登录3307从库,配置复制参数,去掉上述语句中的注释,执行如下 mysql-uroot-poldboy-S/data/3307/mysql.sockCHANGEMASTERTOMASTER_HOST='172.16.1.61',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='oldboy123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=600457;QueryOK,0rowsaffected(0.02sec)#出现此信息表示成功 提示:3307操作此步:会在/data/3307/data下面产生master.info文件 ll/data/3307/data/master.info (6)上述步骤成功后,开启从库复制开关。 startslave;showslavestatus\G#G后面一定不要加封号,会报错的 (7)主从是否成功,最关键的为下面的3项状态参数 mysql-uroot-poldboy123-S/data/3307/mysql.sock-e"showslavestatus\G"|egrep"IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running:Yes#这个是I/O线程状态,状态为Yes表示I/O线程工作正常Slave_SQL_Running:Yes#这个是SQL线程状态,状态为Yes表示I/O线程工作正常Seconds_Behind_Master:0#这是个复制过程中,从库比主库的延迟的秒数 (8)测试主库与从库是否同步1.在主库添加一个新的数据库chris createdatabasechris; 2.检查从库是否有chris这个数据库 mysql>showdatabases;|chris| 删除主库的chirs数据库检查从库是否删除 dropdatabasechris;(主库执行)mysql>showdatabases;(从库执行) ==========================================================六:从库2上的操作(3308)快速配置思路:因为我们已经有了一个MySQL从库,所以只需将3307的从库复制到3308即可(1)从主库中导出数据库,导入从库 mysqldump-uroot-poldboy123-S/data/3306/mysql.sock-B-F--master-data=1-A--events|gzip>/server/backup/rep3308_bak$(date+%F).sql.gz提示:--master-data=1会将备份时的位置点记录下来CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.000009',MASTER_LOG_POS=107; (2)将数据导入从库3308 cd/server/backup/gzip-drep3308_bak2016-07-29.sql.gzmysql-uroot-poldboy-S/data/3308/mysql.sock<./rep3308_bak2016-07-29.sql (3)检查3308数据库是否生成master.info文件 ll/data/3308/data/master.info (4)登录3308从库,配置复制参数 mysql-uroot-poldboy-S/data/3308/mysql.sockCHANGEMASTERTOMASTER_HOST='172.16.1.52',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='oldboy123'; (5)上述步骤成功后,开启从库复制开关。 startslave;showslavestatus\G#G后面一定不要加封号,会报错的 (6)主从是否成功,最关键的为下面的3项状态参数 mysql-uroot-poldboy123-S/data/3307/mysql.sock-e"showslavestatus\G"|egrep"IO_Running|SQL_Running|_Behind_Master"Slave_IO_Running:Yes#这个是I/O线程状态,状态为Yes表示I/O线程工作正常Slave_SQL_Running:Yes#这个是SQL线程状态,状态为Yes表示I/O线程工作正常Seconds_Behind_Master:0#这是个复制过程中,从库比主库的延迟的秒数 ==========================================================七:当我们使用show slave status\G查看主从复制出现故障时,可以看情况跳过(1)临时停止同步开关 stopslave; (2)将同步指针向下移动一个,如果多次不同步可以重复操作 setglobalsql_slave_skip_counter=1; (3)开启同步开关 startslave; (4)查看同步信息是否正常 showslavestatus\G ==========================================================八:测试主库与从库是否可以实现同步 mysql-uroot-poldboy123-S/data/3306/mysql.sockmysql-uroot-poldboy123-S/data/3307/mysql.sockmysql-uroot-poldboy123-S/data/3308/mysql.sock (1)在主库上创建一个数据库 createdatabaseliyajin;(主库执行) (2)查看从库1,从库2是否有同步过来 showdatabases;(从库1执行)|liyajin|showdatabases;(从库2执行)|liyajin| (3)将主库中的liyajin数据库删除, mysql>dropdatabaseliyajin;(主库执行) (4)查看从库是否也会删除 showdatabases;(从库1执行)showdatabases;(从库2执行) (5)最后查看从库的同步状态是否有错误,如果没有错误则MySQL主从复制配置成功 showslavestatus\G 提示:一般删除数据库都会有提示同步错误,我们需要设置忽略错误即可 九:现在我们来将配置好的MySQL数据库打包成RPM包 依赖包:ncurses-devellibaio-develcmake 将LAMP环境进行RPM打包 (1):设置打包完成后执行的脚本 mkdir/server/scripts/-pvim/server/scripts/mysql-init.sh#!/bin/bashuseradd-u505mysql-s/sbin/nologin-Mchown-Rmysql.mysql/data//data/3306/mysqlstart/data/3307/mysqlstart/data/3308/mysqlstart\cp/application/mysql/bin/*/usr/local/sbin/cat>>/etc/rc.local<<EOF#mysqlmultiinstances/data/3306/mysqlstart/data/3307/mysqlstart/data/3308/mysqlstartEOF (3):LAP一键RPM包打包(打包以前要关闭数据库) /data/3306/mysqlstop/data/3307/mysqlstop/data/3308/mysqlstopfpm-sdir-trpm-nmysqld-v1.0--description'3306,3307,3308'-d'ncurses-devellibaio-develcmake'--post-install/server/scripts/mysql-init.sh/application/usr/local/lib//usr/local/bin//data/ 总结:三个实例数据库密码都是oldboy123(4)将制作完成的RPM上传到服务器上安装即可 yum-ylocalinstalllamp-1.0-1.x86_64.rpm (5)安装完成以后的检查80与3306端口是否打开 ll/application/netstat-ltnp (2)配置YUM客户端-客户端配置 cd/etc/yum.repos.d/rm-f/etc/yum.repos.d/{CentOS-Base.repo,epel.repo}mvCentOS-Base.repoCentOS-Base.repo.bakcat>/etc/yum.repos.d/etiantian.repo<<EOF[etiantian]name=Serverbaseurl=http://10.0.0.61enabled=1gpgcheck=0EOFyumcleanallyummakecacheyumrepolistcd