zoukankan      html  css  js  c++  java
  • 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》

     

    配置若有遗漏或错误,请评论留言。
  • 相关阅读:
    zbb20181207 springboot @ConfigurationProperties使用
    zbb20181206 logback,lombok 默认日志logback配置解析
    Spring Boot (8) 全局异常处理
    Spring Boot (7) JdbcTemplate访问数据库
    Spring Boot (6) Spring Data JPA
    Spring Boot (4) 静态页面和Thymeleaf模板
    Spring Boot (3) 热部署devtools
    Spring Boot (2) Restful风格接口
    Spring Boot (1) 构建第一个Spring Boot工程
    idea使用maven搭建ssm框架实现登陆商品增删改查
  • 原文地址:https://www.cnblogs.com/BrokenEaves/p/14427007.html
Copyright © 2011-2022 走看看