默认情况下,复制是异步的,从站不需要永久连接以接收来自主站的更新。根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。

MySQL中复制的优点包括:

横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可能发生在一个或多个从站上。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。

数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。

分析 - 可以在主服务器上创建实时数据,而信息的分析可以在从服务器上进行,而不会影响主服务器的性能。

远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

先去网站下载 https://dev.mysql.com/downloads/mysql/

压缩包有如下内容:

说明:

标准安装:安装 mysql-community-server, mysql-community-client, mysql-community-libs, mysql-community-common,和 mysql-community-libs-compat包。

标准安装之后的文件布局如下:

-开始安装

把文件上传到服务器,解压。

[root@localhost soft]# mkdir mysql8
[root@localhost soft]# tar -xvf mysql-8.0.-.el7.x86_64.rpm-bundle.tar -C /soft/mysql8/

然后进入解压目录安装:

[root@localhost soft]# cd mysql8/
[root@localhost mysql8]# yum install mysql-community-{server,client,common,libs}-*

选择y,最后出现Complete!

两台全部安装完后,进行配置

基于二进制日志文件位置的复制

传统方法基于master的二进制日志复制事件,并要求其中的日志文件和位置在masterslave之间同步。

1. 打开主服务器。去修改配置文件,设置日志文件名称和服务器ID,以及需要复制的数据库

[root@localhost mysql8]# vim /etc/my.cnf

2. 打开从服务器,配置服务器ID

3. 配置用户

每个从站使用MySQL用户名和密码连接到主站,因此主站上必须有用户帐户,从站可以使用该帐户进行连接。

3.1 先启动主服务器

[root@localhost mysql8]# systemctl start mysqld
[root@localhost mysql8]# systemctl status mysqld

然后查看初始密码

[root@localhost mysql8]# cat /var/log/mysqld.log | grep password

然后登陆

[root@localhost mysql8]# mysql -u root -p

一般要求你执行命令之前先重置密码

mysql> alter user user() identified by "Abc666-S";
Query OK, rows affected (0.01 sec)

=========================

我们会发现默认的密码强度要求太高了,太简单的不行比如1234会报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

查看当前策略

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | |
| validate_password.mixed_case_count | |
| validate_password.number_count | |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | |
+--------------------------------------+--------+
rows in set (0.00 sec)

然后设置一下等级即可:(如果密码长度你介意的话也可以改小,语句类似于下面这行)

mysql> set global validate_password.policy=LOW;
Query OK, rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | |
| validate_password.mixed_case_count | |
| validate_password.number_count | |
| validate_password.policy | LOW |
| validate_password.special_char_count | |
+--------------------------------------+-------+
rows in set (0.01 sec)

最后可以修改简单密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '';
Query OK, rows affected (0.01 sec) mysql> exit;
Bye 

=========================

回到正题,创建一个专门为复制服务的用户。

mysql> CREATE USER 'my_slave'@'%' IDENTIFIED BY '';
Query OK, rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'my_slave'@'%';
Query OK, rows affected (0.01 sec) mysql> flush privileges;

caching_sha2_passwordsha256_password认证插件提供比mysql_native_password插件更安全的密码加密,并且caching_sha2_password的性能比sha256_password更好。

MySQL 8.0中创建新用户默认使用caching_sha2_password插件,必须设置安全连接。

要使用加密连接传输复制期间所需的二进制日志,主服务器和从服务器都必须支持加密的网络连接。如果任一服务器不支持加密连接,则无法通过加密连接进行复制。

我们也可以使用MySQL5.7 的默认身份认证插件:mysql_native_password

指定插件即可:

CREATE USER 'my_slave'@'%' IDENTIFIED WITH mysql_native_password BY '';
ALTER USER 'my_slave'@'%' IDENTIFIED WITH mysql_native_password BY '';

3.2.  查看Master状态

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, rows affected (0.24 sec) mysql> SHOW MASTER STATUS;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql-log-bin. | | test | mysql | |
+----------------------+----------+--------------+------------------+-------------------+
row in set (0.02 sec) mysql>

4. 开启防火墙

firewall-cmd --zone=public --add-port=/tcp --permanent

systemctl restart firewalld

5. 配置从服务器,连接到主服务器

5.1 第一次进入先改密码

[root@localhost mysql8]# cat /var/log/mysqld.log | grep password
--26T12::.691834Z [Note] [MY-] [Server] A temporary password is generated for root@localhost: Yg*CpFsrn0A7
[root@localhost mysql8]# mysql -u root -p
Enter password: mysql> alter user user() identified by "Abc666-S";
Query OK, rows affected (1.02 sec)

5.2 设置连接主服务器的信息

如果使用默认的插件:caching_sha2_password

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.192.128',
-> MASTER_USER='my_slave',
-> MASTER_PASSWORD='',
-> MASTER_LOG_FILE='mysql-log-bin.000009',
-> MASTER_LOG_POS=,
-> MASTER_SSL=;
Query OK, rows affected, warnings (0.09 sec)

如果使用MySQL5.7 的插件:mysql_native_password

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.192.128',
-> MASTER_USER='my_slave',
-> MASTER_PASSWORD='',
-> MASTER_LOG_FILE='mysql-log-bin.000009',
-> MASTER_LOG_POS=;
Query OK, rows affected, warnings (0.09 sec)

5.3 最后启动slave线程

mysql> start slave;
Query OK, rows affected (0.10 sec) mysql> show slave status\G;
*************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.192.128
Master_User: my_slave
Master_Port:
Connect_Retry:
Master_Log_File: mysql-log-bin.
Read_Master_Log_Pos:
Relay_Log_File: localhost-relay-bin.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-log-bin.
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:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: Yes
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
Master_UUID: b580af4c--11e9--000c295a3c5c
Master_Info_File: mysql.slave_master_info
SQL_Delay:
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count:
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position:
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key:
Network_Namespace:
row in set (0.05 sec)

6. 两台服务器都已经配好,现在看一下是否会同步。

..

如果要停止从服务器的复制线程

stop slave;

7. 附

MySQL默认是开启SSL的,查看:

show variables like '%ssl%';

基于二进制日志文件的复制到此为止

基于全局事务标识符的复制

基于全局事务标识符(GTID)的方法是事务性的,因此不需要处理这些文件中的日志文件或位置,这极大地简化了许多常见的复制任务。在主服务器上提交的所有事务将应用于从服务器,使用GTID进行复制可确保主服务器和从服务器之间的一致性。

未完待续

最新文章

  1. javaScript语法总结
  2. linq group by多个字段,返回多个字段.
  3. Guid和Sequence做主键的比较
  4. Java系列: 关于HttpSessionListener的sessionDestroyed什么时候触发
  5. 【SPFA】 最短路计数
  6. 模拟实现兼容低版本IE浏览器的原生bind()函数功能
  7. HDU 1561The more, The Better(树形DP)
  8. 非常实用的15款开源PHP类库
  9. php中的作用域
  10. AV 地址错误 map 文件 根据地址报错,查 Delphi 代码
  11. mysql hash索引优化
  12. Oracle定时器调用存储过程
  13. IE8升级新版Flash Player ActiveX14导致的discuz图片附件无法上传 解决方法
  14. [转]编译 JavaScriptCore For iOS
  15. iOS多线程开发之NSThread
  16. Python学习笔记,day1
  17. 【Selenium2】【Jenkins】
  18. C# 将DateTime.Now.DayOfWeek的值转为中文星期
  19. linux环境中安装NRPE插件执行远程"本地资源"检查?NRPE安装?
  20. poj1836 Alignment

热门文章

  1. 三、Snapman多人协作电子表格之——软件的基本功能
  2. Android为TV端助力之Webview与JS双向交互
  3. SQLServer创建用户自定义数据库用户
  4. 浏览器仿EXCEL表格插件 - 智表ZCELL产品V1.4发布
  5. 服务消费者Feign和Ribbon的区别
  6. 【spring源码分析】IOC容器初始化(二)
  7. SQL LAST() 函数
  8. jQuery中$.each()方法的使用
  9. ssrfme 复现
  10. Ubuntu server 16.04的安装 以及配置(服务器版)