指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
PS:这里需要用到binlog日志
1.Master 数据库只要发生变化,立马记录到Binary log 日志文件中
2.Slave数据库启动一个I/O thread连接Master数据库,请求Master变化的二进制日志
3.Slave I/O获取到的二进制日志,保存到自己的Relay log 日志文件中。
4.Slave 有一个 SQL thread定时检查Realy log是否变化,变化那么就更新数据
1.实现服务器负载均衡
即可以通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好的客户相应时间。通常情况下,数据库管理员会有两种思路。
(1) 一是在主服务器上只实现数据的更新操作。包括数据记录的更新、删除、新建等等作业。而不关心数据的查询作业。数据库管理员将数据的查询请求全部 转发到从服务器中。这在某些应用中会比较有用。如某些应用,像基金净值预测的网站。其数据的更新都是有管理员更新的,即更新的用户比较少。而查询的用户数 量会非常的多。此时就可以设置一台主服务器,专门用来数据的更新。同时设置多台从服务器,用来负责用户信息的查询.
(2)二是在主服务器上与从服务器切分查询的作业。在这种思路下,主服务器不单单要完成数据的更新、删除、插入等作业,同时也需要负担一部分查询作业。而从服务器的话,只负责数据的查询。当主服务器比较忙时,部分查询请求会自动发送到从服务器重,以降低主服务器的工作负荷。
2.通过复制实现数据的异地备份
可以定期的将数据从主服务器上复制到从服务器上,这无疑是先了数据的异地备份。在传统的备份体制下,是将数据备份在本地。此时备份 作业与数据库服务器运行在同一台设备上,当备份作业运行时就会影响到服务器的正常运行。有时候会明显的降低服务器的性能。同时,将备份数据存放在本地,也 不是很安全。如硬盘因为电压等原因被损坏或者服务器被失窃,此时由于备份文件仍然存放在硬盘上,数据库管理员无法使用备份文件来恢复数据。这显然会给企业 带来比较大的损失。
3.提高数据库系统的可用性
数据库复制功能实现了主服务器与从服务器之间数据的同步,增加了数据库系统的可用性。当主服务器出现问题时,数据库管理员可以马上让从服务器作为主服务器,用来数据的更新与查询服务。然后回过头来再仔细的检查主服务器的问题。此时一般数据库管理员也会采用两种手段。
(1)一是主服务器故障之后,虽然从服务器取代了主服务器的位置,但是对于主服务器可以采取的操作仍然做了一些限制。如仍然只能够进行数据的查询,而 不能够进行数据的更新、删除等操作。这主要是从数据的安全性考虑。如现在一些银行系统的升级,在升级的过程中,只能够查询余额而不能够取钱。这是同样的道 理。
(2)二是从服务器真正变成了主服务器。当从服务器切换为主服务器之后,其地位完全与原先的主服务器相同。此时可以实现对数据的查询、更新、删除等操 作。为此就需要做好数据的安全性工作。即数据的安全策略,要与原先的主服务器完全相同。否则的话,就可能会留下一定的安全隐患
- linux 操作系统,mysql的docker镜像(8.0)
- 主数据库(master):120.77.85.233:3306
- 从数据库(slave):120.77.85.233:3307
PS:由于之前的服务器都到期了,目前只剩下一台,将就着在docker里面部署
docker run -p 3306:3306 --name my_mysql -v /docker-data/mysql/data/:/var/lib/mysql -v /docker-data/mysql/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
docker run -p 3307:3306 --name my_mysql2 -v /docker-data/mysql2/data/:/var/lib/mysql -v /docker-data/mysql2/conf/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=654321 -d mysql:latest
创建对应目录
/docker-data/mysql/data/ //文件目录
/docker-data/mysql/conf/my.cnf //mysql中docker的配置文件(如果没有,则使用docker cp 复制一份出来使用)
PS:这里没有那配置文件出来,大家在使用中可以配置log目录并挂载出来
root@iZwz91om21c05x13m3q3u6Z:/docker-data/mysql_default# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80eb896f3a97 mysql:latest "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp my_mysql2
c5ff7e2b8d5f mysql:latest "docker-entrypoint.s…" 10 seconds ago Up 9 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp my_mysql
Plugin caching_sha2_password could not be loaded
原因:
mysql8.0默认采用caching_sha2_password的加密方式,而Navicat使用的加密方式mysql_native_password,所以在登录时候出现错误。
解决方法:
- 升级新版本的Navicat,但是在这个全民皆破解时代,买正版,毕竟只有少数人
- 更改数据库加密方式
步骤:
-- 修改密码为用不过期
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
-- 修改密码并指定加密规则为mysql_native_password(如果是从库的话,这里的密码改成654321,对应从库登录密码)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新权限
flush privileges;
mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.02 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
重启docker镜像,你会发现已经连接成功
PS:顺便创建一个library的数据库,再创建两个数据表
[mysqld]
server-id=1 #设置主服务器的ID,可以任意配置但是多个主从之间不能重复
innodb_flush_log_at_trx_commit=2 #控制MySQL 磁盘写入策略,参数2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作
sync_binlog=1 #开启binlog日志同步功能
log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)
binlog-do-db=library # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
slave_skip_errors=all #跳过从库任何错误
auto-increment-offset = 1 # 自增值的偏移量
auto-increment-increment = 1 # 自增值的自增量
创建slave用户,为了主库传输数据到从库使用
CREATE USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';
给予该用户复制的权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'120.77.85.233';
刷新权限
FLUSH PRIVILEGES;
查看主库状态
show master status\G
记录MASTER_LOG_FILE、Position两个参数
mysql> CREATE USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'120.77.85.233';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin-1.000001
Position: 1049
Binlog_Do_DB: library
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show master status\g;
+--------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| mysql-bin-1.000001 | 1049 | library | | |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
ERROR:
No query specified
docker restart mysql
server-id=2
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-2
server-id=2
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-2
关闭从库
stop slave;
修改从库
CHANGE MASTER TO MASTER_HOST='120.77.85.233',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='654321',MASTER_LOG_FILE='mysql-bin-1.000003',MASTER_LOG_POS=861;
MASTER_HOST //主库IP地址
MASTER_PORT //主库端口
MASTER_USER //主库用户(可使用主库创建的slave用户)
MASTER_PASSWORD //主库密码
MASTER_LOG_FILE //主库日志文件名称(主库状态查询)
MASTER_LOG_POS //主库日志记录端口(主库状态查询)
开启从库(每次重启后需要手动开启)
start slave;
查询从库状态
show slave status;
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CHANGE MASTER TO MASTER_HOST='120.77.82.203',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='654321',MASTER_LOG_FILE='mysql-bin-1.000001',MASTER_LOG_POS=1049;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
在搭建新版本的mysql时,遇到了很多的问题(新版命令、配置参数),这次总结一下解决问题的过程,首先定位问题,找到问题是最为重要的,当然定位的最快的就是看日志,通过日志反馈的信息去确定问题大概出现的位置;其次,百度,虽然百度提供的资料大部分是复制粘贴,但有一部分还是有点用;当然最好就是要去官网的论坛或者是问题列表中去查找一下,一般遇到的问题论坛内都会有,可以节省很多的时间。
情况一:
Slave_IO_Running: Connecting
Slave_SQL_Running: YES
通常这种错误是因为账号无法登录造成
解决:
- 在从库中连接主库主从账号,发现无法连接
- 进入主库修改slave的账号密码
- 从库登录主从账号,成功
删除用户
drop user 'slave'@'120.77.85.233';
更改权限
ALTER USER 'slave'@'120.77.85.233' IDENTIFIED WITH mysql_native_password BY '654321';
刷新权限
FLUSH PRIVILEGES;
情况二:
Slave_IO_Running: Yes
Slave_SQL_Running: No
通常情况是因为主库的日志文件名与端口对应不上所导致
解决:
- 进入主库,查看主库状态
- 进入从库,修改从库配置
- 重启从库