设为首页 收藏本站
查看: 888|回复: 0

[经验分享] mysql之主从复制篇

[复制链接]

尚未签到

发表于 2018-9-27 11:21:13 | 显示全部楼层 |阅读模式
  在实际企业应用环境当中,单台mysql数据库是不足以满足日后业务需求的。譬如服务器发生故障,没有备份服务器来提供服务的话,业务就得停止。介于这种情况,我们来学习一下mysql主从复制。
  使用mysql主从复制的好处有:
  1、采用主从服务器这种架构,稳定性得以提升。如果主服务器发生故障,我们可以使用从服务器来提供服务。
  2、在主从服务器上分开处理用户的请求,可以提升数据处理效率。
  3、将主服务器上的数据复制到从服务器上,保护数据免受意外的损失。
  环境描述:
  新企业要搭建架构为主从复制的mysql数据库。
  主服务器(mysql-master):IP地址:192.168.48.128,mysql已安装,没有用户数据。
  从服务器(mysql-slave):IP地址:192.168.48.130,mysql已安装,没有用户数据。
  主从服务器均可正常提供服务。
DSC0000.jpg

  主从复制配置如下:
  在主服务器上操作:
  1)、确保/etc/my.cnf中有如下参数,没有的话需手工添加,并重启mysql服务。
  [mysqld]
  log-bin=mysql-bin 启动二进制文件
  server-id=1 服务器ID
  2)、登录mysql,在mysql中添加一个backup的账号,并授权给从服务器。
  [root@localhost ~]# mysql -uroot –p123456 登录mysql

  mysql> grant replication slave on *.* to 'backup'@'192.168.48.130'>
DSC0001.jpg

  3)、查询主数据库状态,并记下FILE及Position的值,这个在后面配置从服务器的时候要用到。
  mysql> show master status;
DSC0002.jpg

  在从服务器上操作:
  1)、确保/etc/my.cnf中有log-bin=mysql-bin和server-id=1参数,并把server-id=1修改为server-id=10。修改之后如下所示:
  [mysqld]
  log-bin=mysql-bin 启动二进制文件
  server-id=10 服务器ID
  2)、重启mysql服务。
  [root@localhost ~]# mysqladmin -p123456 shutdown
  [root@localhost ~]# mysqld_safe --user=mysql &
DSC0003.jpg

  3)、登录mysql,执行如下语句
  [root@localhost ~]# mysql -uroot –p123456
  mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=401;
DSC0004.jpg

  4)、启动slave同步。
  mysql> start slave;
DSC0005.jpg

  5)、检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
  mysql> show slave status\G
DSC0006.jpg

  验证配置是否正常,mysql主从能否正常复制。
  在主数据库上新建一个库,并且在库中写一个表和一些数据。
  [root@localhost ~]# mysql -uroot –p123456
  mysql> create database mysqltest;
  mysql> use mysqltest;
  mysql> create table user(id int(5),name char(10));
  mysql> insert into user values (00001,'zhangsan');
DSC0007.jpg

  在从数据库中验证一下,是否正常复制到数据。
  [root@localhost ~]# mysql -uroot –p123456
  mysql> show databases;
DSC0008.jpg

  mysql> select * from mysqltest.user;
DSC0009.jpg

  从上图中的结果,我们可以看到mysql主从复制已经在起作用了,我们在主数据库中写入的数据已经复制到我们的从数据库中了。
  环境如下:
  单台数据库存有数据,要升级为主从复制的架构。
  主数据库:mysql-master:IP192.168.48.128,数据库正常提供服务,有数据。
  从数据库:mysql-slave:IP192.168.48.130,数据库正常提供服务,无数据。
DSC00010.jpg

  升级大致步骤如下:
  1、修改主数据库配置文件,开启总从复制必要的功能。
  2、在主数据库中创建一个账号并授权给从数据库使用。
  3、导出主数据库中的数据作。
  4、修改从数据库配置文件,开启总从复制必要的功能。
  5、把刚才主数据库中导出的数据导入到从数据库。
  6、在从数据库中配置连接主数据库要用到的账户、密码等。
  7、启动主从复制功能,并检查是否正常复制。
  开始升级:
  在主数据库上操作:
  1)、确保/etc/my.cnf中有如下参数,没有的话需手工添加,并重启mysql服务。
  [mysqld]
  log-bin=mysql-bin 启动二进制文件
  server-id=1 服务器ID
  2)、登录mysql,在mysql中添加一个backup的账号,并授权给从服务器。
  [root@localhost ~]# mysql -uroot –p123456 登录mysql

  mysql> grant replication slave on *.* to 'backup'@'192.168.48.130'>
DSC00011.jpg

  3)、查看已有的数据库有哪些;
  mysql> show databases;
DSC00012.jpg

  4)、进行锁表操作,不让数据进行写入动作,这么做事为了防止从数据库的原始数据和主数据库的原始数据不一致。
  mysql> flush tables with read lock;
DSC00013.jpg

  5)、查询主数据库状态,并记下FILE及Position的值,这个在后面配置从服务器的时候要用到。
  mysql> show master status;
DSC00014.jpg

  6)、切换一个终端,使用mysqldump命令将刚才查询到的两个库导出来。
  mysql> mysqldump –uroot –p123456 mysqltest > mysqltest.sql
  mysql> mysqldump –uroot –p123456 test1234 > test1234.sql
DSC00015.jpg

  7)、将导出来的库文件传送到从数据库的/root目录下。
  [root@localhost ~]#scp mysqltest.sql test1234.sql root@192.168.48.130:/root/
  这中间需要输入一次验证口令。见下图
DSC00016.jpg

  8)、切换回之前的终端,进行表解锁操作。
  mysql> unlock tables;
DSC00017.jpg

  主数据库服务器上的操作告一段落。
  在从数据库上操作:
  1)、确保/etc/my.cnf中有log-bin=mysql-bin和server-id=1参数,并把server-id=1修改为server-id=10。修改之后如下所示:
  [mysqld]
  log-bin=mysql-bin 启动二进制文件
  server-id=10 服务器ID
  2)、重启mysql服务。
  [root@localhost ~]# mysqladmin -p123456 shutdown
  [root@localhost ~]# mysqld_safe --user=mysql &
DSC00018.jpg

  3)、登录数据库,确认要同步的库名不存在。
  [root@localhost ~]# mysql -uroot –p123456
  mysql> show databases;
DSC00019.jpg

  4)、创建名为mysqltest和test1234的库。
  mysql> create database mysqltest;
  mysql> create database test1234;
DSC00020.jpg

  4)、切换一个终端,将传过来的两个数据文件分别导入对应的数据库下。
  [root@localhost ~]# mysql -uroot –p123456 mysqltest < mysqltest.sql
  [root@localhost ~]# mysql -uroot –p123456 test1234 &lt; test1234.sql
DSC00021.jpg

  5)、切换回之前的终端,执行如下语句
  mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=1650;
  5)、切换回之前的终端,执行如下语句
  mysql> change master to master_host='192.168.48.128',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=1650;
  6)、启动主从复制功能。
  mysql> start slave;
DSC00022.jpg

  7)、
  检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
  mysql> show slave status\G
DSC00023.jpg

  验证主从是否正常配置:
  在主数据库上插入数据:
  mysql> show databases;
  mysql> show tables;
  mysql> use mysqltest;
  mysql> select * from user;
  mysql> insert into user values (4,'ergou');
  mysql> insert into user values (5,'sanwazi');
DSC00024.jpg

  在从数据库上查看是否正常同步:
  mysql> show databases;
  mysql> use mysqltest;
  mysql> select * from user;
DSC00025.jpg

  上图可以看出,主从之间已经可以正常复制了。
  今天就先到这里吧O(&cap;_&cap;)O~
  mysql主从复制碰到的小问题
  一个朋友在做mysql主从复制的时候碰到了一些问题,他已经按照我之前的教程一步步做了。但是就是不知道是怎么回事。从数据库中使用命令show slave status\G查看到的结果如下图:
DSC00026.jpg

  我们知道,要想mysql主从复制成功的先决条件是Slave_IO_Running和Slave_SQL_Running均为Yes,而上图所示的结果显然是有一个不满足条件。
  再根据Last_IO_Error的错误代码2013及下面的错误提示我们可以知道,从数据库无法正常连接到主数据库。
  这里原因有三:
  1、主数据库没有给从数据库登录授权
  2、网络不通
  3、有防火墙
  明白这三点之后我们就可以针对原因依次来解决它们:
  登录主数据库,给从数据库授权
  [root@localhost ~]# mysql -uroot –p123456 登录主数据库

  mysql> grant replication slave on *.* to 'backup'@'192.168.48.130'>
DSC00027.jpg

  检查网络是否通畅
  [root@localhost ~]# ping -c 4 192.168.48.128 再从服务器上ping主服务器。
DSC00028.jpg

  分别在主从服务器上检查防火墙状态
  我们可以直接关闭防火墙
  运行命令:[root@localhost ~]# setup
DSC00029.jpg

  选择防火墙(Firewall configuretion)这一项.
DSC00030.jpg

  将它Disabled掉。
DSC00031.jpg

  或者你可以直接使用命令:
  [root@localhost ~]# service iptables stop 即时生效,系统重启后失效
  [root@localhost ~]# chkconfig iptables off 当前状态无效,系统重启后生效
  大家可以结合使用
DSC00032.jpg

  以上情况都排除完毕,我们来再测试一下主从是否能正常连接。
  在从数据库中执行如下命令:
  mysql>stop slave;
  mysql>start slave;
DSC00033.jpg

  然后查看主从连接状态
  mysql>show slave status\G
DSC00034.jpg

  经过上述操作,我那位朋友成功排除了主从不能复制的故障。
  故障2:报错如下:

  意思就是从上的server_id和主的一样的,经查看发现从上的/etc/my.cnf中的server_id=1这行我没有注释掉(在下面复制部分我设置了server_id),于是马上把这行注释掉了,然后重启mysql,发现还是报同样的错误。
  使用如下命令查看了一下server_id
  show variables like 'server_id';
  发现,mysql并没有从my.cnf文件中更新server_id,既然这样就只能手动修改了
  mysql> set global server_id=10; #此处的数值和my.cnf里设置的一样就行
  mysql> slave start;
  如此执行后,slave恢复了正常。
  不过稍后蚊子使用/etc/init.d/mysqld restart重启了mysql服务,然后查看slave状态,发现又出现了上面的错误,然后查看server_id发现这个数值又恢复到了1。
  之后蚊子又重新查看了一下/etc/my.cnf的内容,确认应该不是这个文件的问题,于是去google查了一下,看到mysql在启动的时候会查找/etc/my.cnf、DATADIR/my.cnf,USER_HOME/my.cnf。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602747-1-1.html 上篇帖子: Mysql Cluster 7.6.4 环境搭建 下篇帖子: mysql的主从,主主,半同步,SSL复制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表