Linux之mysql

######mysql######
#1.mysql的主从复制

1)下载mysql的rpm包
tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar

2)安装需要的包
yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
#安装后会替换mariadb相关的库文件
#server2也需要装

3)修改配置文件,配合官方文档看
负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限

vim /etc/my.cnf

log-bin=mysql-bin ##文档最后加,二进制日志复制,id号来区分主机
server-id=1

4)启动mysql
systemctl start mysqld

5)会生成一个临时密码

cat /var/log/mysqld.log | grep password

2019-02-23T07:39:25.392617Z 1 [Note] A temporary password is generated for root@localhost: N7Nn<KkJsa!a

6)尝试连接,但是发现不能查看库
mysql -uroot -p’N7Nn<KkJsa!a’
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

7)安全初始化
mysql_secure_installation
密码要求有大小写,数字,特殊字符,其他全选y
完成后可以登录数据库

8)创建并授权用来做复制的用户
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中

mysql> grant replication slave on . to repl@‘172.25.136.%’ identified by ‘Wsp+123ld’;

mysql> show plugins; ##查看插件,因为有密码插件,所以密码必须设置为复杂的

mysql> show master status; ##查看master状态

##在server2上同样初始化mysql
修改/etc/my.cnf

vim /etc/my.cnf

server-id=2 ##文件最后加

启动mysql
systemctl start mysqld

#在物理机上尝试连接master的数据库,测试repl帐号
mysql -h 172.25.136.1 -urepl -pWsp+123ld
可以登录,但是查看不到任何信息,因为没有权限

#在server2上配置master信息
mysql> change master to master_host=‘172.25.136.1’, master_user=‘repl’, master_password=‘Wsp+123ld’, master_log_file=‘mysql-bin.000002’, master_log_pos=1004;
MASTER_LOG_POS 它是日志的开始位置
#其中master_log_file和maMASTER_LOG_POS的值为0,因为它是日志的开始位置ster_log_pos写在server1上执行show master status看到的信息

mysql> start slave;

mysql> show slave status\G ##查看主从复制状态
Slave_IO_Running: Yes
Slave_SQL_Running: Yes ##这两个参数是Yes,表示成功

9)创建新数据测试主从同步是否生效
‘注意:写操作只能在master节点上做,因为master节点不会去同步slave节点的内容’
mysql> create database westos; ##在server2上发现也能看到westos库
mysql> use westos
mysql> create table usertb (
-> username varchar(10) not null,
-> password varchar(15) not null); ##建表

mysql> desc usertb; ##查看表信息

mysql> insert into usertb values (‘user1’,‘123’); ##插入数据

mysql> select * from usertb; ##查看

###########基于GTID的主从复制 + 半同步(作业)
由于同一事务的GTID在所有节点上的值一致
我们都不需要知道GTID的具体值
‘前提:需要做好前面的binlog复制’
在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步

从服务器连接到主服务器之后,把自己执行过的GTID(Executed_Gtid_Set)<SQL线程> 、获取到的GTID(Retrieved_Gtid_Set)<IO线程>发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去补全即可。当主服务器挂掉的时候,找出同步最成功的那台从服务器,直接把它提升为主即可。如果硬要指定某一台不是最新的从服务器提升为主, 先change到同步最成功的那台从服务器, 等把GTID全部补全了,就可以把它提升为主了

show variables like ‘log_%’; #查看二进制日志

1)先在server1上添加配置

vim /etc/my.cnf ##在文件最后添加

gtid_mode=ON
enforce-gtid-consistency=true

mysql> select * from gtid_executed; ##是空的,因为还没重启 ##在slave上面看
Empty set (0.00 sec)

root@server1 mysql]# mysqlbinlog mysql-bin.000002 ##可以看到之前做的操作都在里面

[root@server1 mysql]# cat auto.cnf ##看到server1的uuid
[auto]
server-uuid=f84e8de1-38a2-11e9-b78c-5254009afece

systemctl restart mysqld

2)在server2上配置 (mysql5.6 slave必须开启binlog日志 但是5.7中不是必须的)

gtid_mode=ON(必选)
enforce-gtid-consistency(必选)
log_bin=ON(可选)–高可用切换,最好设置ON
log-slave-updates=ON(可选)–高可用切换,最好设置ON

vim /etc/my.cnf ##在文件最后添加

gtid_mode=ON
enforce-gtid-consistency=true

systemctl restart mysqld ##重启

#现在server2上查看主从复制状态是否正常
[root@server2 mysql]# pwd
/var/lib/mysql
#[root@server2 mysql]# cat relay-log.info #查看relay-log

mysql> stop slave; ##先停止复制
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO ##修改master信息
-> MASTER_HOST = ‘172.25.136.1’,
-> MASTER_USER = ‘repl’,
-> MASTER_PASSWORD = ‘Wsp+123ld’,
-> MASTER_AUTO_POSITION = 1; ##启用gtid,它是自动的

mysql> start slave;

mysql> show slave status\G ##查看状态,可以看到下面两个参数是空的
Retrieved_Gtid_Set:
Executed_Gtid_Set:

##在server1上插入数据
mysql> insert into usertb values (‘user2’,‘123’);
Query OK, 1 row affected (0.01 sec)

mysql> insert into usertb values (‘user3’,‘123’);
Query OK, 1 row affected (0.00 sec)

#再在server2上查看状态
Retrieved_Gtid_Set: f84e8de1-38a2-11e9-b78c-5254009afece:1-2
Executed_Gtid_Set: f84e8de1-38a2-11e9-b78c-5254009afece:1-2 ##发现这两个参数变了,从1位置开始复制的

再查看gtid模式复制的起始和结束位置
mysql> use mysql

mysql> select * from gtid_executed;
±-------------------------------------±---------------±-------------+
| source_uuid | interval_start | interval_end |
±-------------------------------------±---------------±-------------+
| f84e8de1-38a2-11e9-b78c-5254009afece | 1 | 1 |
| f84e8de1-38a2-11e9-b78c-5254009afece | 2 | 2 |
±-------------------------------------±---------------±-------------+
2 rows in set (0.00 sec)

##########mysql半同步#########
异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

在2010年MySQL 5.5版本之前,一直采用的是这种异步复制的方式。主库的事务执行不会管备库的同步进度,如果备库落后,主库不幸crash,那么就会导致数据丢失。于是在MySQL在5.5中就顺其自然地引入了半同步复制,主库在应答客户端提交的事务前需要保证至少一个从库接收并写到relay log中

##对照官方文档 https://dev.mysql.com/doc/refman/5.7/en/replication-semisync-installation.html
1)正常的复制为:事务一(t1)写入binlog buffer;dumper线程通知slave有新的事务t1;binlog buffer进行checkpoint;slave的io线程接收到t1并写入到自己的的relay log;slave的sql线程写入到本地数据库。 这时,master和slave都能看到这条新的事务,即使master挂了,slave可以提升为新的master。

2)异常的复制为:事务一(t1)写入binlog buffer;dumper线程通

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值