工作有几年了,可是还是还是在写着简单的 curd,这不行,得搞一下 mysql 主从
准备
两台带有 mysql 的服务器(意思就是不管你是linux还是window,只要有 mysql 就行)
两台服务器的 ip 地址为 192.168.123.57 和192.168.123.58
其中 192.168.123.58为主数据库
192.168.123.57为从数据库
本文中,主从环境均为 linux 下的 ubuntu 环境(为了方便学习,本文是使用的 docker 搭建的 mysql 8.0)
正文
配置主数据库。
- 找到 mysql 的配置 . 本文的配置文件名为 my.cnf
打开配置文件,通过搜索找到
[mysqld],然后换行并添加如下配置:# 下文中 xxx 为文件目录,请自行替换. 推荐: /var/log/mysql server-id = 1 #mysql-bin 会自动生成 mysql-bin.000001 log-bin = 'xxxx/mysql-bin' # 错误日志 log-error= 'xxxx/mysql-error'; # 主从同步忽略的数据库 binlog-ignore = mysql # 主从同步需要同步的数据库 binlog-do-db = test
给从数据库库授权 [ mysql 命令行中执行该命令]
CREATE USER 'root'@'192.168.123.%' IDENTIFIED BY 'mytest'; GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.123.%';刷新授权,让授权生效- 可有可无 [ mysql 命令行中执行该命令]
FLUSH PRIVILEGES;重启数据库服务
# 网上推荐这个重启 mysql 服务。我为了让格式好看,自然也就写了这个,其实我是 docker,所以不存在这种启动方式,我直接重启容器 mysql.server restart查看 master 是否配置成功 [ mysql 命令行中执行该命令]
show master status \G;查看 从数据库的信息 [ mysql 命令行中执行该命令]
show master hosts \G;
配置从数据库
- 从数据库的配置,文件名字:mysql.cnf
# 下文中 xxx 为文件目录,请自行替换. 推荐: /var/log/mysql server-id = 1 #mysql-bin 会自动生成 mysql-bin.000001 log-bin = 'xxxx/mysql-bin' # 错误日志 log-error= 'xxxx/mysql-error'; 需要同步的数据库 replicate-do-db=test从数据库也需要授权 [ mysql 命令行中执行该命令]
change master to master_host='192.168.123.58', master_user='root', master_password='mytest', master_log_file='mybin-log.000001' , master_log_pos=323; # 以上是一个完整的一行命令, master_host 为主数据库的地址,master_user 为主数据库的账户,master_password 为主数据库的密码,master_log_file 为主数据库的二进制文件的名字,master_log_pos 为主数据库log文件里面的行号,可以通过 <code>show master status \G</code>获取对应的行号- 从数据库也需要重启数据库服务,和主服务器的一致
在从服务器上开启同步进程 [ mysql 命令行中执行该命令]
start slave;查看同步状态 [ mysql 命令行中执行该命令]
show slave status; # 会得到如下结果-仅供参考 mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for source to send event Master_Host: 192.168.123.58 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mybin-log.000001 Read_Master_Log_Pos: 632 Relay_Log_File: 044ebe077274-relay-bin.000004 Relay_Log_Pos: 633 Relay_Master_Log_File: mybin-log.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: test 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: 632 Relay_Log_Space: 849 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: db775ba0-16f4-11ec-9463-0242ac150002 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)此处需要注意:查看 Slave_IO_Running 和 Slave_SQL_Running 。必须让这两个值都为 yes 才算是成功。如果不是 yes。 可以查看 Last_io_Errno 上显示的错误,然后根据错误进行修改
- 在主数据库进行写操作测试,查看从数据库是否有相同的数据。
如下所示:
大佬这个不错啊,收藏学习下。咳~
我好像知道老虎以前cn和net两个站怎么同步的了。