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

[经验分享] MySQL Replication 即主从复制

[复制链接]

尚未签到

发表于 2018-10-6 11:23:31 | 显示全部楼层 |阅读模式
  MySQL Replication主要用于MySQL的时时备份或者读写分离。在配置之前先做一下准备工作,配置两台mysql服务器,或者在一台服务器上配置两个端口也可以。
  流程示意图:
  A-->change data-->bin_log-->transfer-->B-->repl_log-->change data
  一、搭建好了一个mysql,跑的是3306端口。
  1、下载mysql到/usr/local/src/
  

wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz  

  

  2、解压缩
  

tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz  

  3.把解压完的数据移动到/usr/local/mysql
  

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql  

  4.建立mysql用户
  

useradd -s /sbin/nologin mysql  

  5.初始化数据库
  

cd /usr/local/mysql  
mkdir -p /data/mysql
  
chown -R mysql:mysql  /data/mysql
  
./scripts/mysql_install_db  --user=mysql  --datadir=/data/mysql
  

  6.拷贝配置文件
  cp support-files/my-large.cnf   /etc/my.cnf拷贝配置文件
  7.拷贝启动脚本文件并修改其属性
  

cp support-files/mysql.server    /etc/init.d/mysqld  
chmod 755  /etc/init.d/mysqld
  

  8.修改启动脚本
  

vim /etc/init.d/mysqld  

  需要修改的地方有 “datadir=/data/mysql”
  basedir=/usr/local/mysql
  9.把启动脚本加入系统服务项,并设定开机启动,启动mysql
  

chkconfig --add mysqld  
chkconfig  mysqld on 或service  mysqld  start或/etc/init.d/mysqld  start
  

  检查mysqld是否启动的命令为:ps aux |grep mysqld
  二、下面再搭建一个3307端口的mysql:
  

[root@localhost ~]#  mkdir  /data/mysql_slave  
[root@localhost ~]# chown  -R  mt=ysql:mysql  /data/mysql_slave
  
[root@localhost ~]# cd /usr/local/
  
[root@localhost local]# cp -r mysql mysql_slave
  
[root@localhost local]# cd mysql2
  
[root@localhost mysql_slave]#./scripts/mysql_install_db   --user=mysql  --datadir=/data/mysql_slave
  [root@localhostmysql_slave]# cp /etc/my.cnf  .
  
[root@localhost mysql_slave]# vim my.cnf
  

【mysqld】  
 改为:port = 3307  
  
 改为:socket = /tmp/mysql_slave.sock
  
在这一行的下面再加一行:
  
 datadir= /data/mysql_slave 
  

  保存后就可以启动它了:
  

[root@localhost mysql_slave]# cd bin/  
[root@localhost bin]# ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
  

  
重启:pid=`ps aux|grep mysql2.sock|grep -v grep|awk '{print $2}'`;kill $pid;cd /usr/local/mysql2/bin/; ./mysqld_safe --default-file=../my.cnf --user=mysql &
  

  若开机启动,需要把启动命令加入到/etc/rc.local中
  如果想跟mysqld一样脚本启动,则:
  

  
[root@localhost mysql_slave]# cd /etc/init.d/
  
[root@localhost init.d]# cp mysqld  mysqldslave
  
vim mysqldslave
  
改datadir=/data/mysql”    为   datadir=/data/mysql_slave
  
   basedir=/usr/local/mysql 为   basedir=/usr/local/mysql_slave
  
改conf=/etc/my.cnf            为   conf=$basedir/my.cnf
  

  也可以配置到/etc/init.d/mysqlslave
  

cp -r mysql mysql_slave  

  同样修改
  

basedir=/usr/local/mysql_slave  
datadir=/data/mysql_slave
  
conf=$basedir/my.cnf
  

  后面的conf路径
  

conf=$basedir/my.cnf  

  但是不能使用/etc/init.d/mysqlslave start启动
  可以使用service mysqlslave start
  

[root@hardman bin]# chkconfig --add mysqldslave  
[root@hardman bin]# chkconfig mysqldslave on
  
[root@hardman bin]# chkconfig --add mysqld
  
[root@hardman bin]# chkconfig mysqld on
  

  也可以将写入到/etc/rc.d/rc.local文件中:
  

echo "./mysqld_safe --defaults-file=../my.cnf --user=mysql &" >>/etc/rc.d/rc.local  

  三、在主服务器上创建测试数据库:
  三、在主服务器上创建测试数据库:
  登录两台mysql
  

mysql -h127.0.0.1 -P3306    #通过主机端口登陆  
mysql -h127.0.0.1 -P3307
  
mysql -S /tmp/mysql.sock    #通过sock登陆
  
mysql -S /tmp/mysql_slave.sock
  
mysql -uroot  -p密码  #通过密码登陆
  

  登录mysql:/usr/local/mysql/bin/mysql -uroot  -p199610
  或mysql -S  /tmp/mysql.sock  
  登录mysql_slave:mysql -S  /tmp/mysql_slave.sock  或者mysql -h127.0.0.1 -P3307 (无密)
  把3306端口的mysql作为主(master),而把3307的mysql作为从(slave)
  为了让实验更加像生产环境,先在master上创建一个库db1
  [root@localhost bin]# mysql -uroot -S /tmp/mysql.sock -p199610
  mysql> create database db1;
  Query OK, 1 row affected (0.01 sec)
  mysql> quit
  Bye
  // -S 后面指定mysql的socket文件路径,这也是登陆mysql的一种方法,因为在一台服务器上跑了两个mysql端口,所以,只能用 -S 这样的方法来区分。
  创建了db1库,然后把mysql库的数据复制给它:
  

mysqldump -uroot -S /tmp/mysql.sock  mysql > 123.sql     #备份   
mysql -uroot -S /tmp/mysql.sock db1  grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123456';  

  //这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123456,这里的127.0.0.1为slave的ip(因为我们配置的master和slave都在本机)。
  

mysql> flush privileges;           #刷新    
mysql>flush tables with read lock;   #锁定数据库,此时不允许更改任何数据
  
mysql>unlock tables;
  
mysql> show master status;  #查看状态,这些数据是要记录的,一会要在slave端用到
  
+--------------+----------+--------------+------------------+
  
| File         | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  
+--------------+----------+--------------+------------------+
  
| aiker.000001 |      587 |              |                  |
  
+--------------+----------+--------------+------------------+
  
1 row in set (0.00 sec)
  


  • 设置slave  先修改slave的配置文件my.cnf:
      

    vim /usr/local/mysql_slave/my.cnf  

      找到 “server-id = 1” 这一行,删除掉或者改为 “server-id = 2” 总之不能让这个id和master一样,否则会报错。
      另外在从上,如下两行,黑白名单,看主mysql有没有配置
      

    replicate-do-db=db1,db2  
    replicate-ignore-db=db1,db2

      改完后,重启slave:
      

    service mysqld_slave restart  

      拷贝master上的db1库的数据到slave上,因为master和slave都在一台服务器上,所以操作起来简单了很多,如果是不同的机器,可能就需要远程拷贝了,希望你注意这一点:
      

    [root@localhost ~]# mysqldump -uroot -S /tmp/mysql.sock -pyourpassword db1 > 123.sql  
    [root@localhost ~]# mysql -uroot -S /tmp/mysql_slave.sock -pyourpassword -e "create database db1"
      
    [root@localhost ~]# mysql -uroot -S /tmp/mysql_slave.sock -pyourpassword db1  slave stop;  
    Query OK, 0 rows affected, 1 warning (0.00 sec)
      

      
    mysql> change master to master_host='127.0.0.1',master_port=3306,master_user='repl', master_password='123123',master_log_file='aiker.000001', master_log_pos=587;
      
    Query OK, 0 rows affected (0.02 sec)
      

      
    mysql> slave start;
      
    Query OK, 0 rows affected (0.00 sec)
      

      
    mysql> show slave status\G
      

      在主mysql上解锁
      

    mysql -uroot -S  /tmp/mysql_slave.sock -p123123 -e  "unlock tables"  

      或者
      

    mysql> unlock tables;  
    Query OK, 0 rows affected (0.00 sec)
      

      3、测试主从
      在master上执行如下命令:
      

    [root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"  

    +----------+  
    | count(*) |
      
    +----------+
      
    |        2 |
      
    +----------+
      
    [root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;truncate table db" 清空db1的表
      
    [root@hardman bin]# mysql -uroot -S /tmp/mysql.sock -pederew -e "use db1;select count(*) from db"
      
    +----------+
      
    | count(*) |
      
    +----------+
      
    |        0 |
      
    +----------+
      

      
    [root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"
      
    +----------+
      
    | count(*) |
      
    +----------+
      
    |        0 |
      
    +----------+
      

      slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:
      

    [root@hardman ~]# mysql -S /tmp/mysql_slave.sock -e "use db1;select count(*) from db"  
    ERROR 1146 (42S02) at line 1: Table 'db1.db' doesn't exist
      

      主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slavestart.



  • 运维网声明 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-613652-1-1.html 上篇帖子: Ubuntu下安装mysql数据库教程 下篇帖子: MySQL--使用xtrabackup进行备份还原
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

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

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

    扫描微信二维码查看详情

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


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


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


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



    合作伙伴: 青云cloud

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