1、主从复制

1、复制的基本原理

slave会从master读取binlog来进行数据同步

1、三个步骤

image.png

  • master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件binary log events
  • slave将master的binary log events拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的

    2、复制的基本原则

  • 每一个slave只有一个master

  • 每个slave只能有一个唯一的服务器ID
  • 每个master可以有多个salve

    3、复制的最大问题

  • 延时

    4、一主一从常见配置

    1、前置条件

  • mysql版本一致且后台以服务器运行

  • 主从都配置在[mysqld]节点下,都是小写

    2、主机修改my.ini配置文件

  • [必须]主服务器唯一ID

    • server-id=1
  • [必须]启用二进制日志
    • log-bin=自己本地的路径/mysqlbin
    • log-bin=/usr/local/mysql/bin/mysql/mysqlbin
  • [可选]启用错误日志
    • log-err=自己本地的路径/mysqlerr
    • log-err=/usr/local/mysql/bin/mysql/mysqlerr
  • [可选]根目录
    • basedir=”自己本地路径/“
    • basedir=”/usr/local/mysql/bin/mysql/“
  • [可选]临时目录
    • tmpdir=”自己本地路径”
    • tmpdir= “/usr/local/mysql/bin/mysql/“
  • [可选]数据目录
    • datadir=”自己本地路径/Data/“
    • datadir=”/usr/local/mysql/bin/mysql/Data/“
  • read-only=0
    • 主机,读写都可以
  • [可选]设置不要复制的数据库
    • binlog-ignore-db=mysql
  • [可选]设置需要复制的数据库

    • binlog-do-db=需要复制的主数据库名字

      1、配置

      [mysqld]
      #配置主从配置主机配置
      server-id=1
      log-bin=/usr/local/mysql/bin/mysql/mysqlbin/
      log-err=/usr/local/mysql/bin/mysql/mysqlerr/
      basedir=/usr/local/mysql/bin/mysql
      tmpdir= /usr/local/mysql/bin/mysql
      datadir="/usr/local/mysql/bin/mysql/Data/"
      read-only=0
      binlog-ignore-db=mysql
      binlog-do-db=learn
      

      2、mac配置

      #配置主从配置主机配置
      log_bin=mysql-bin
      binlog_format=mixed
      server_id = 1
      read-only=0
      binlog-ignore-db=mysql
      binlog-do-db=learn
      

      3、从机修改my.cnf配置文件

  • [必须]主服务器唯一ID

    • server-id=2
  • 可选启用二进制日志

    • log-bin=自己本地的路径/mysqlbin
    • log-bin=/var/lib/mysql/mysql/mysqlbin
      [mysqld]
      log_bin=mysql-bin
      binlog_format=mixed
      server_id = 2
      

      4、后置条件

  • 配置完都重启数据库

  • 主机要对端口进行放行
  • 或者关闭防火墙

    • linux防火墙 service iptables stop

      5、在master上创建账户授权给slave

      GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'192.168.1.154' IDENTIFIED WITH mysql_native_password  BY '123456';
      
  • mysql8.0命令

    CREATE USER 'zhangsan'@'192.168.1.154' IDENTIFIED WITH mysql_native_password BY '123456';
    
  • 刷新配置

    flush privileges;
    

    ```sql mysql> CREATE USER ‘zhangsan’@’192.168.1.154’ IDENTIFIED WITH mysql_native_password BY ‘123456’; Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

<a name="OE7wl"></a>
### 6、查询master的状态
```sql
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |      156 | learn        | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

记录下File和Position值
执行完这些操作之后不再操作主服务器MYSQL,防止主服务器状态值发生变化

7、在从机Slave上配置需要复制的主机

  • 配置从机命令 ```sql mysql> CHANGE MASTER TO MASTER_HOST=’192.168.1.105’,MASTER_USER=’zhangsan’,MASTER_PASSWORD=’123456’,MASTER_LOG_FILE=’mysql_bin.000005’,MASTER_LOG_POS=156 -> ; Query OK, 0 rows affected, 2 warnings (0.01 sec)

- 开始复制
```sql
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  • 查看状态
    show slave status;
    
    下面两个参数都是Yes,则说明主从配置成功
    slave_io_running:yes
    slave_sql_running:yes

8、之后创建表等

  • 之后就可以创建包,添加数据等
  • 每次重新配置都得去主机查看新的File和position值再次重新配置