MySql 配置主从同步

简单配置mysql主从同步

注意:已有数据不会同步过来,需要先手动导入!!!之后的才会从binlog日志中的开始同步
mysql主从同步原理

(ps:个人理解): 主服务器开启binlog日志记录增删改这些改变数据的操作;
从服务器配置好主服务用于同步的账号、密码、ip、port、正运行binlog日志、日志的position位置;
并开启中继日志relay-log,这时候配置好启动slave start进程;从服务器会产生两个线程Slave_IO与Slave_SQL;
IO线程用于读取主服务器上的binlog日志并写入到relay-log日志中,SQL负责转换relay-log为sql语句并写入从库。

docker容器的mysql初始化操作

# 拉取mysql镜像
[root@localhost ~]# dcoker pull mysql:latest  
# 起一个mysql容器 ---注意docker   run mysql容器时需要初始化密码   
[root@localhost ~]# docker run -itd --name mysql8 -p 3307:3306   -e MYSQL_ROOT_PASSWORD=123456  mysql:8.0.28
# 进入容器
[root@localhost ~]# docker exec -it mysql8 bash
登陆数据库
# mysql -uroot -p123456
添加创建作用于全局的mysql用户
mysql> create user 'root'@'%'  identiifed by '123456';
授予刚刚创建的用户权限
mysql>  grant all  on *.* to 'root'@'%' identified by '123456';   ----all 表示所有权限select,insert等.... ;*.*----表示所有库表前为库后为表
一般只需要一个复制的权限  replication slave   replication client 

主节点从节点初始化都一样操作,这里直接用root用户当做同步的用户
## 在主从中主库用于同步的用户权限代表着可以同步的库,没有权限无法同步那个库表,直接给全部*.* 就好

主库从库配置

开始主库与从库的配置

  1. 修改配置文件my.cnf 主库开启binlog日志,从库开启relay-log日志;主从都需要配置server id且不能相同;
  2. 主库配置用于同步的用户,并给到权限
  3. 从库配置添加主库用户同步的账号信息与binlog日志与日志的位置信息
1、
# 修改配置文件,添加上
vi /etc/my.cnf     ----从库
[mysqld]
relay_log=/var/lib/mysql/log/slave-relay.log
server-id=2
vi /etc/my.cnf   -----主库
[mysqld]
server_id=1
log-bin=/var/lib/mysql/log/master-bin.log
# 日志过期时间
expire_logs_days=30
# binlog每个日志文件大小
max_binlog_size = 100m

2、
# 主库添加创建用户
mysql> create user 'root'@'%'  identiifed by '123456';
授予刚刚创建的用户权限
mysql>  grant all  on *.* to 'root'@'%' identified by '123456';   ----all 表示所有权限select,insert等.... ;*.*----表示所有库表前为库后为表

主库导出现有数据等下需要导入从库
mysqldump  -uroot -ppassword -A  --single-transaction --master-data=2  |gzip >xxx.gz
参数讲解: -A 导出所有库  --single-transaction 不锁表   --master-data=2 记录当前binlog位置信息
3、
# 从库添加配置
主库binlog的信息
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      157 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
适用于没有数据的情况下

有数据需要看dump 导出的sql文件:head -n 30 xxx.sql 可以看到binlog日志。
有数据的情况下需要先导入主库dumo出来的数据:
进入数据库 source  /xxx/xxx.sql ----------等待数据完全导入

------------------需要进入数据库哈------------------
change master to master_host='主节点ip',
master_user='同步的用户名',
master_password='密码',
master_port=端口,
master_log_file='主库正在使用的binlog日志文件',    ----主库中show master status;可以查看
master_log_pos=位置信息;   ----Position

slave start;  启动进程开始同步

此时已经配置完成两边都需要重启mysql
在从库中使用
show slave status \G 查看
如果有一个进程无法起来排查方向:
1、检查防火墙,两台机器分别登陆对方机器
2、对比主库master信息是否与slave信息是否能对的上
3、从库stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 跳过错误
START SLAVE;

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.244.150
                  Master_User: root
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 157
               Relay_Log_File: slave-relay.000003
                Relay_Log_Pos: 327
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes                             ###这个线程必须起来
            Slave_SQL_Running: Yes                          ###这个线程必须起来
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 157
              Relay_Log_Space: 713
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: ae316caa-fce6-11ec-889c-0242ac110002
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

你可能感兴趣的:(mysql,mysql,docker,数据库)