• MySQL Replication配置


    1 配置MySQL服务

    2 配置 Replication

    2.1 设置主(master)

    2.2 设置从(slave)

    3 测试主从

    MySQL Replication配置

    MySQL Replication又称“AB复制”或者“主从复制”,他主要用于MySQL的实时备份或者读写分离。在配置之前先做一下准备工作:配置两台MySQL服务器,或者一台服务器配置两个端口。本次实验为一台服务器上运行两个MySQL。

    1 配置MySQL服务

    之前搭建了3306端口的MySQL,现搭建3307的MySQL

    # cd /usr/local/
    # cp -r mysql mysql_2
    # cd mysql_2
    # ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2

    完整搭建MySQL代码(上面配置出错再回来看):

    # /usr/local/src/
    # wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
    # tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
    # mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
    # useradd -s /sbin/nologin mysql
    # cd /usr/local/mysql
    # mkdir -p /data/mysql
    # chown -R mysql:mysql /data/mysql
    # ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
    ​
    # cp support-files/my-default.cnf /etc/my.cnf
    # vim /etc/my.cnf               //修改参数
    innodb_buffer_size = 128M
    log_bin = aminglinux
    ​
    basedir = /usr/local/mysql
    datadir = /data/mysql
    port = 3306
    server_id = 128
    socket = /tmp/mysql.sock
    ​
    join_buffer_size = 128M
    sort_buffer_size = 2M
    red_rnd_buffer_size = 2M
    ​
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    ​
    # cp support-files/mysql.server /etc/init.d/mysqld
    # chmod 755 /etc/init.d/mysqld
    # vim /etc/init.d/mysqld
    datadir=/data/mysql
    # chkconfig --add mysqld
    # chkconfig mysqld on
    # service mysqld start
    # ps aux |grep mysqld
    

      

     

    然后初始化数据库目录,显示两个“OK”并生成/data/mysql2目录才正确;错误请查看15章详细步骤。

    复制配置文件到/usr/local/mysql_2目录下

    # cp /etc/my.cnf    ./my.cnf
    # vim my.cnf            //修改部分参数
    log_bin = aminglinux2
    basedir = /usr/local/mysql_2
    datadir = /data/mysql2
    port = 3307
    server_id = 129
    socket = /tmp/mysql2.sock
    

      

    复制启动脚本并编辑

    # cp support-files/mysql.server /etc/init.d/mysqld2
    # vim /etc/init.d/mysqld2   //改
    basedir=/usr/local/mysql_2
    datadir=/data/mysql2
    $bindir/mysqld_safe --defaults-file=$basedir/my.cnf --datadir="$datadir" --pid-file="$mysql_pid_file_path" $other_args >/dev/null &
    第三行为启动命令,增加了--defaults参数,若不增加则不能正确找到mysql_2的配置文件。
    

      

    
    

    启动两个MySQL:

    # /etc/init.d/mysqld start
    # /etc/init.d/mysqld2 start
    # netstat -lnp |grep mysql
    tcp6        0       0   :::3306     :::*        LISTEN      21388/mysqld
    tcp6        0       0   :::3307     :::*        LISTEN      21787/mysqld
    unix    2   [ ACC ]     STREAM  LISTENING   154331  21787/mysqld    /tmp/mysql2.sock
    unix    2   [ ACC ]     STREAM  LISTENING   152879  21388/mysqld    /tmp/mysql.sock
    

    2 配置 Replication

    打算把3307端口的MySQL作为主(master),把3306的MySQL作为从(slave)。为了让实验更接近生产环境,先在master上创建一个库aming。

    # mysql -uroot -S /tmp/mysql2.sock
    mysql> create database aming;
    mysql> quit

    -S(大写)后面指定MySQL的socket文件路径,这也是登录MySQL的一种方法。因为一台服务器上运行两个MySQL端口,所以用-S这样的方法来区分。

    然后先把mysql库的数据复制给aming库,如下:

    # mysqldump -uroot -S /tmp/mysql2.sock mysql > /tmp/aming.sql
    # mysql -uroot -S /tmp/mysql2.sock aming < /tmp/aming.sql

    2.1 设置主(master)

    上面操作以将mysql_2的配置文件设置过相关的参数

    如果还没有设置,请添加:

    server_id=129
    log_bin=aminglinux2
    ​
    //下面两个参数选择性地使用
    binlog-do-db=databasename1,databasename2
    binlog-ignore-db=databasename1,databasename2

    binlog-do-db=为定义需要复制的数据库,多个数据库用英文的逗号分隔

    binlog-ignore-db=定义不需要复制的数据库,这两个参数用其中一个即可。

     

    如果修改过配置文件,重启MySQL服务

    # /etc/init.d/mysqld2 restart
    # mysqladmin -uroot -S /tmp/mysql2.sock password 'aminglinux.com'
    # mysql -uroot -S /tmp/mysql2.sock -p
    password:
    mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123lalala';
    

    //这里
    repl是为从(slave)端设置的访问主(master)端的用户,也就是要完成主从复制的用户,这里的127.0.0.1为slave的IP(因为配置的master和slave都在本机)

     

    锁定数据库写操作

    mysql> flush tables with read lock;

    查看mester的状态,这些数据要记录,一会在slave端用到:

    mysql> show master status;
    File        Position    Binlog_Do_DB    Binlog_Ignore_DB    Executed_Gtid_Set
    aminglinxu2   652867
    

    2.2 设置从(slave)

    首先修改slave的配置文件my.cnf

    # vim /etc/my.cnf
    找到server_id=,设置成和master不一样的数字,若一样会导致后面的操作不成功。
    在slave上,也可以选择性地增加如下两行,对应master增加的两行
    binlog-do-db=databasename1,databasename2
    binlog-ignore-db=databasename1,databasename2
    ​
    # /etc/init.d/mysqld restart
    

    复制master上aming库的数据到slave上。master和slave都在一台服务器上,操作很简单。如果是不同机器,需要远程复制(使用scp或rsync)

    # mysqldump -uroot -S /tmp/mysql2.sock -p'aminglinux.com' aming > /tmp/amingl.sql
    # mysql -uroot -S /tmp/mysql.sock -p123456 -e "create database aming"
    # mysql -uroot -S /tmp/mysql.sock -p123456 aming < /tmp/aming.sql

    -e:执行MySQL的内部命令。

     

    在slave上配置

    # mysql -uroot -S /tmp/mysql.sock -p123456
    mysql> stop slave;
    mysql> change master to master_host='127.0.0.1',
    master_port=3307,master_user='repl',
    master_password='123lalala',
    master_log_file='aminglinux.000003',
    master_log_pos=652867;
    mysql> start slave;

    ps:change master这个命令是一条,逗号接回车键,直到分号才算结束。

     

    其中master_log_file和master_log_pos是在前面使用show master status命令查到的数据。

    在master上执行(打开两个终端分别运行MySQL):

    # msyql -uroot -S /tmp/mysql2.sock -p'aminglinux.com' -e 'unlock tables'
    

    在slave端查看slave的状态

    mysql> show slave statusG;
    ...
    Slave_IO_Running: Yes
    Slave_SQL_Runing: Yes
    ...
    Second_behind_Master: 0     //为主从复制延迟的时间
    Last_IO_Errno: 0
    Last_IO_Error:
    Last_SQL_Errno: 0
    Last_SQL_Error:

    如果主不正常,需要看这里的error信息。

    3 测试主从

    在master上执行

    # mysql -uroot -S /tmp/mysql2.sock -p 'aminglinux.com' aming
    mysql> select count(*) from db;
    count(*)
        2
    mysql> truncate table db;               //清空表数据
    mysql> select count(*) from db;
    count(*)
        0

    清空了aming.db表的数据库。

    查看slave上该表的数据:

    # mysql -uroot -S /tmp/mysql.sock -p123456 aming
    mysql> select count(*) from db;
    count(*)
        0
    

    slave上的数据也被清空了。

    但好像不太明显,不妨在master上继续删除db表:

    mysql> drop table db;

    再从slave查看:

    mysql> select * from db;
    ERROR 1146 (42S02): Table 'aming.db' doesn't exist
    

    这次很明显了,db表不见了。主从配置起来虽然很简单,但这种机制非常脆弱,一旦我们不小心在slave上写了数据,那么主从复制也就被破坏了。

    另外,如果重启master,务必要先关闭slave,即在slave上执行slave stop命令,然后再去重启master的MySQL服务,否则主从复制很有可能就会中断。重启master后,我们还需要执行start slave命令开启主从复制的服务。

     

    出处:《跟阿铭学Linux》

     

    配置若有遗漏或错误,请评论留言。
  • 相关阅读:
    成都的收藏品市场
    微信小程序 如何定义全局函数?
    Linux下 安装VMware Tools工具
    小程序圆角进度条实现方法
    Excel 将换行符替换为空
    再次学习mysql优化
    Subl 命令
    时间见证着—eternal life
    大巧不工web前端设计修炼之道—笔记
    批量更新某字段内容
  • 原文地址:https://www.cnblogs.com/BrokenEaves/p/14427007.html
Copyright © 2020-2023  润新知