vip2-day24

题目

  1. 将 MYSQL 主从复制的用途、工作原理、实施注意事项写出来。并且划出主从结构图和把实施的步骤写在文档里面。
  2. 构建 MYSQL 主主复制,实现在主库操作增删改,从库能够同步,在从库操作增删改,主库也能同步数据。

主从复制

用途

可实现数据备份,读写分离,亦可解决单点故障,实现冗余互备。

工作原理

  1. 主库 I/O 线程将新增,删除,更改操作记录在 binlog 文件中,并对每个操作添加相应点位。
  2. 从库 I/O 线程根据配置向主库发送读取相应 binlog 文件及点位数据的请求。
  3. 主库根据收到的请求返回相应数据及当前 binlog 文件及点位数据。
  4. 从库 I/O 线程接收到主库返回的数据后,将 binglog 数据写入到自己的中间文件中;同时,记录供下次读取使用的 binlog 文件名和相应点位。
  5. 从库 SQL 线程将自己中继文件中的数据读取出来,解析成 SQL 语句,并在从库执行相应的操作。

注意事项

  1. 主从库的 server-id 必须是全局唯一的,不可重复。
  2. 配置从库时,binlog 文件和点位一定要和主库一致。
  3. 搭建完主从结构后一定要确认从库 I/O 线程和 SQL 线程是否正常工作。
  4. 要尽量降低主从之间的延迟。
  5. 出现主从异常后,要根据实际业务情况选择合适的解决方案。
  6. 恢复异常或新增从库时,如果需要锁表,需多方沟通,确认可行再操作。解锁时要确认主从正常工作,方可解锁。

主从结构图

change
read
return
write
read
readback
Master
Slave
bin-log
relay-log
Master I/O thread
Slave I/O thread
Slave SQL thread

实施步骤

  1. 安装 mysql 8:$ yum -y install mysql-community-server

  2. 编辑配置文件:/etc/my.cnf

    • Master 编辑内容:

      [mysqld]
      # 数据库 GID 不可重复
      server-id = 110
      # 日志文件前缀
      log-bin = mysql-bin
      
    • Slave 编辑内容:

      [mysqld]
      # 数据库 GID 不可重复
      server-id = 111
      
  3. 启动数据库:$ systemctl start mysqld

  4. 登录主库创建从库连接账号:> create user 'tongbu'@'%' identified with mysql_native_password by 'WahahaAyaya123!';

  5. 给账号授权:> grant replication slave on *.* to 'tongbu'@'%';

  6. 查看主库 Master 状态:

    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |     1573 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  7. 登录从库设置 Master 信息:

    > change master to master_host='192.168.0.110',
    master_user='tongbu',
    master_password='WahahaAyaya123!',
    master_log_file='mysql-bin.000001',
    master_log_pos=1573;
    
  8. 从库开启同步:> start slave;

  9. 查看 slave 状态信息:> show slave status\G

                Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
  10. 测试:

    1. 在 Master 库创建数据库:

      mysql> create database test_03;
      Query OK, 1 row affected (0.01 sec)
      
      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | sys                |
      | test_01            |
      | test_03            |
      +--------------------+
      7 rows in set (0.00 sec)
      
    2. 查看 Slave 库:

      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | mysql              |
      | performance_schema |
      | sys                |
      | test_03            |
      +--------------------+
      6 rows in set (0.01 sec)
      

互为主从

基础环境:两台虚拟机分别为 110, 111,均已装好 MySQL 8。

搭建步骤:

  1. 修改两个数据库的配置文件:

    # 110
    [mysqld]
    server-id = 110
    log-bin = 110-bin
    
    # 111
    [mysqld]
    server-id = 111
    log-bin = 111-bin
    
  2. 重启数据库:$ systemctl restart mysqld

  3. 创建账号:

    -- 110
    mysql> create user 'tb110'@'%' identified with mysql_native_password by 'WahahaAyaya123!';
    
    -- 111
    mysql> create user 'tb111'@'%' identified with mysql_native_password by 'WahahaAyaya123!';
    
  4. 授权:

    -- 110
    mysql> grant replication slave on *.* to 'tb110'@'%';
    
    -- 111
    mysql> grant replication slave on *.* to 'tb111'@'%';
    
  5. 查看 Master 状态:

    -- 110
    mysql> show master status;
    +----------------+----------+--------------+------------------+-------------------+
    | File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +----------------+----------+--------------+------------------+-------------------+
    | 110-bin.000001 |      662 |              |                  |                   |
    +----------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    -- 111
    mysql> show master status;
    +----------------+----------+--------------+------------------+-------------------+
    | File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +----------------+----------+--------------+------------------+-------------------+
    | 111-bin.000001 |      662 |              |                  |                   |
    +----------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
  6. 配置 Slave:

    -- 110
    mysql> change master to 
        -> master_host='192.168.0.111',
        -> master_user='tb111',
        -> master_password='WahahaAyaya123!',
        -> master_log_file='111-bin.000001',
        -> master_log_pos=662;
    
    -- 111
    mysql> change master to 
        -> master_host='192.168.0.110',
        -> master_user='tb110',
        -> master_password='WahahaAyaya123!',
        -> master_log_file='110-bin.000001',
        -> master_log_pos=662;
    
  7. 开启 Slave:> start slave;

  8. 查看状态:

    -- 110
                Slave_IO_State: Waiting for source to send event
                    Master_Host: 192.168.0.111
                    Master_User: tb111
                    Master_Port: 3306
                    Connect_Retry: 60
                Master_Log_File: 111-bin.000001
            Read_Master_Log_Pos: 662
                Relay_Log_File: centos7-110-relay-bin.000002
                    Relay_Log_Pos: 324
            Relay_Master_Log_File: 111-bin.000001
                Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    -- 111
                Slave_IO_State: Waiting for source to send event
                    Master_Host: 192.168.0.110
                    Master_User: tb110
                    Master_Port: 3306
                    Connect_Retry: 60
                Master_Log_File: 110-bin.000001
            Read_Master_Log_Pos: 662
                Relay_Log_File: centos7-111-relay-bin.000009
                    Relay_Log_Pos: 324
            Relay_Master_Log_File: 110-bin.000001
                Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
  9. 测试建库:

    -- 110
    mysql> create database test110;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test110            |
    | test_01            |
    | test_03            |
    +--------------------+
    7 rows in set (0.00 sec)
    
    -- 111
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | test110            |
    | test_03            |
    +--------------------+
    6 rows in set (0.01 sec)
    
  10. 测试建表:

    -- 111
    mysql> use test110;
    Database changed
    mysql> create table t111 (id int,name varchar(32),stunt varchar(64));
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> desc t111;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int         | YES  |     | NULL    |       |
    | name  | varchar(32) | YES  |     | NULL    |       |
    | stunt | varchar(64) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.01 sec)
    
    -- 110
    mysql> use test110;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> desc t111;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | int         | YES  |     | NULL    |       |
    | name  | varchar(32) | YES  |     | NULL    |       |
    | stunt | varchar(64) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
  11. 测试插入数据:

    -- 110
    mysql> insert into t111 value (1,'李莫愁','冰魄银针'), (2,'杨过','黯然销魂掌'), (2,'小龙女','玉女素心剑');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    1 | 李莫愁    | 冰魄银针        |
    |    2 | 杨过      | 黯然销魂掌      |
    |    2 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    3 rows in set (0.00 sec)
    
    -- 111
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    1 | 李莫愁    | 冰魄银针        |
    |    2 | 杨过      | 黯然销魂掌      |
    |    2 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    3 rows in set (0.00 sec)
    
  12. 测试修改数据:

    -- 111
    mysql> update t111 set id = 3 where name = '小龙女';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    1 | 李莫愁    | 冰魄银针        |
    |    2 | 杨过      | 黯然销魂掌      |
    |    3 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    3 rows in set (0.00 sec)
    
    -- 110
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    1 | 李莫愁    | 冰魄银针        |
    |    2 | 杨过      | 黯然销魂掌      |
    |    3 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    3 rows in set (0.00 sec)
    
  13. 测试删除数据:

    -- 110
    mysql> delete from t111 where id = 1;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    2 | 杨过      | 黯然销魂掌      |
    |    3 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    2 rows in set (0.00 sec)
    
    -- 111
    mysql> select * from t111;
    +------+-----------+-----------------+
    | id   | name      | stunt           |
    +------+-----------+-----------------+
    |    2 | 杨过      | 黯然销魂掌      |
    |    3 | 小龙女    | 玉女素心剑      |
    +------+-----------+-----------------+
    2 rows in set (0.00 sec)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tp404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值