河南龙祥软件科技有限公司

He Nan Long Xiang Software Technology Co., Ltd.

24小时服务热线:18236995786

主从数据库笔记

查看计算机名称:hostnamectl

修改计算机名称:hostnamectl set-hostname 新名称

计算机名称文件:/etc/hostname,那个/etc/hosts文件中修改了没有起作用。

如果修改了计算机名称,在远程连接别的数据库时会使用计算机名代替ip地址,此时需要把ip地址和计算机名添加到/etc/hosts文件中,否则访问不了,更改后重启计算机才会生效。

效果:

127.0.0.1  localhost

::1        localhost

192.168.40.90   node1

192.168.40.91   node2

192.168.40.92   node3

将端口加入防火墙:firewall-cmd --zone=public --add-port=33061/tcp --permanent    #permanent是永久生效的意思,如果没有这个参数,重启服务器就不生效了,设置好后重启防火墙生效。

重启防火墙:systemctl restart firewalld.service

查看防火墙开启的端口:firewall-cmd --list-all

把3306端口也加入到防火墙中,否则后面单主模式时从节点连接主节点需要登录时会报错连接不上。

安装mysql数据库服务版:yum install mysql-server;

查看数据库版本号:mysql -V

show plugins;可以查看安装的数据库插件。

mysql的日志文件mysqld.log如果被删掉了,重新启动一下mysql服务就会自动生成一个,手动创建的文件不起作用。

创建数据库并设置数据库编码和规则:create database zufuzhi1 default charset utf8 collate utf8_general_ci;

创建表:CREATE TABLE `user` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',

  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',

  `age` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

主从数据库:

所有数据库的server-id不能相同。UUID不能相同。

如果是服务器版,修改my.cnf.d文件夹下的mysql-server.cnf文件,在mysqld下面添加配置信息。如果是数据库版,则是在my.cnf文件中的mysqld下面添加配置信息。

配置文件位置:/etc/my.cnf(数据库版)、/etc/my.cnf.d/mysql-server.cnf(数据库服务器版)

主从数据库的配置文件的[mysqld]下都增加:server-id=1(后面的1根据情况设置,各数据库之间不能相同)。

启动mysql服务:systemctl start mysqld,systemctl status mysqld可以查看数据库状态。

使用命令查看临时密码:cat /var/log/mysqld.log | grep password,这个是数据库版的位置,服务器版的位置是/var/log/mysql/mysqld.log,注意区别,有些版本的数据库默认密码是空。

进行安全初始化:mysql_secure_installation,执行这个操作会让选择密码强度,0是超过8位,1是数字、大小写、特殊符号组合,2是文件方式,一般选1,设置密码和重复输入密码后进行后续的设置分别是:移除匿名用户、禁止远程登录、移除测试库、刷新授权表,全部选是,都是在进行一些安全措施。

使用账号密码登录数据库:mysql -uroot -p

查看数据库:show databases;

查看表:show tables;

创建用户并授权:

create user 'zhao'@'192.168.40.%' identified by 'ZHANGsan123!@#';    ##创建用户,用户名是zhao,这个用户在ip地址为192.168.40网段的服务器上可以远程登录这个数据库,密码是ZHANGsan123!@#。

grant replication slave on *.* to 'zhao'@'192.168.40.%';             ##授权为可以复制master(主数据库)节点数据的slave(从数据库)节点,ip地址为192.168.40网段的服务器上的从数据库可以使用zhao这个用户复制主数据库上的数据。

##replication:表示复制权限。*.*:表示对所有库的所有表都授权。zhao:用户名。192.168.40.%:授权192.168.40网段的所有数据库节点都可以同步(复制)

flush privileges;       ##刷新。

show master status;     ##查看master节点的状态,记住File值(日志文件名称)和Position值(日志文件位置),后面使用。

展示结果:

  +-------------------+-----------+----------------+-------------------+--------------------+

  | File              |  Position |   Binlog_Do_DB |  Binlog_Ignore_DB |  Executed_Gtid_Set |

  +-------------------+-----------+----------------+-------------------+--------------------+

  | mysql-bin.000001  |       769 |                |                   |                    |

  +-------------------+-----------+----------------+-------------------+--------------------+

在从数据库1服务器上查看主服务器配置是否正常:mysql -h 192.168.40.1 -uzhao -pZHANGsan123!@#,这是使用主数据库授权的用户远程登录主数据库,可以登录进数据库说明主数据库配置正常,使用查看数据库命令看不到重要信息。

异步复制(基于bin日志)

主数据库有改变数据的操作后,会生成日志,然后把日志发送给所有从数据库,从数据库得到日志后执行相同的操作,如果从数据库执行失败,后面都不会继续执行。

在slave(从数据库)节点上配置主节点master(主数据库)的信息,并开启:

mysql> change master to

    ->  master_host='192.168.40.90',          ##master节点IP

->  master_user='zhao',                   ##设置连接主数据库的用户。

->  master_password='ZHANGsan123',        ##设置连接主数据库的用户的密码。

->  master_log_file='mysql-bin.000001',   ##要复制的文件名称。

->  master_log_pos=769;                   ##要复制的文件位置。

启动slave:start slave;  启动后从节点才会执行从主数据库复制日志的操作。

查看slave的执行结果:show slave status\G;   会展示执行复制的主数据库地址、复制文件名称、复制文件位置等信息,还有复制结果,如果Slave_IO_Running和Slave_SQL_Running都是Yes,说明执行成功了,如果有一个是No,就要查看是什么原因并处理,在last_error里有最后一条错误的提示信息。如果最后的参数是\g,也能查到信息,只不过展示的形式不一样。在此之后,主数据库上执行了什么操作,从数据库都会进行同步,如果在执行某一步失败了,比如因为从表数据和主表不一致出现了失败,就需要恢复到和主表执行那一步前一致再执行。

查看日志中的内容:mysqlbinlog mysql-bin.000001。首先要进入日志文件中,在/var/lib/mysql文件夹中。

基于二进制文件位置的主从复制会因为master一个事件的中断而造成数据丢失进而不能复制。

异步复制(基于事务标识GTID)

主数据库有改变数据的操作后,会生成事务,然后把事务发送给所有从数据库,从数据库得到事务信息后执行相同的操作。如果从数据库执行这个事务中有操作失败,则回滚到执行事务之前,后面的都不回继续处理。

基于gtid的主从复制不会因为master一个事件的中断而造成数据丢失而不能复制。

配置主从数据库的配置文件:

gtid_mode=ON

enforce-gtid-consistency=ON

在从数据库上开始配置主节点master的信息,并开启:

mysql> stop slave;    ##停止slave。

mysql> change master to

->    master_host='192.168.40.90',    ##设置master节点IP

->    master_user='zhao',             ##设置连接主数据库的用户。

->    master_password='ZHANGsan123',  ##设置连接主数据库的用户的密码。

->    master_auto_position=1;         ##从第一条事务开始跟踪。

开启slave:start slave;

此时在主数据库上进行操作,从数据库会自动同步。

查看slave的执行结果:show slave status\G;  Retrieved_Gtid_Set和Executed_Gtid_set有值时说明执行成功了。

在从数据库中查看gtid信息:select * from mysql.gtid_executed;

半同步复制

需要安装一个mysql内部插件,然后激活,如果是临时安装,则重启数据库后这个功能将会关闭,要实现永久开启可以写在配置文件中。

主数据库执行一条改变操作时,先将操作发给所有从数据库,有任意一个从数据库接收到操作并返回信号,主数据库才会执行这个操作。否则主数据库在等待超过10秒后就不等从数据库了,直接执行,第二次再执行就不等10秒直接执行,半同步复制在一次失败后会自动切换为异步复制,等从数据库启动后会将没做过的操作做一遍,然后才开始以半同步方式继续进行。

在主从数据库上安装半同步复制插件:install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

检测插件是否正确安装:

select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';  #看到plugin_name下面有rpl_semi_sync_master,状态是ACTIVE时说明正常。

激活插件:set global rpl_semi_sync_master_enabled=1;    如果是这样临时的安装和激活,每次重启数据库都要重新激活一下。

查看插件激活状态:show variables like 'rpl_semi_sync%';  #当看到rpl_semi_sync_slave_enabled的值是ON时,说明激活成功了,如果启动了io进程,会看到参数rpl_semi_sync_master_timeout,这个值默认是10秒,是主数据库等待从数据库响应的超时时间。

重启io进程:stop slave io_thread; start slave io_thread; #如果启动不成功,说明两端的数据不同步,要先处理同步了才可以。

在主数据库查看状态:show status like '%rpl%';   Rpl_semi_sync_master_clients后面的值是等待同步的从数据库数量

全同步复制(组复制)

组复制支持单主模型和多主模型两种工作方式(默认是单主模型)

单主模型:从复制组中众多个MySQL节点中自动选举一个master几点,只有master节点可以写,其他节点自动设置为只读,当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其它slave将指向这个新的master。

多主模型:多主复制通常是环形复制,在环中的每个节点都作为主库,每个主库都可以拥有多个备库。复制组中的任何一个节点都可以写,因此没有master和slave的概念。

组复制的效率很低:当master节点写数据的时候,会等待所有的slave节点完成数据的复制,然后才继续往下进行,组复制的每一个节点都可能是slave。

查看服务器90的数据库uuid,在/var/lib/mysql/auto.cnf文件中。用这个uuid作为三个数据库的组名,组名必须是一个UUID格式的值,因为三个数据库的uuid不能和这个组名一样,所以90服务器上的数据库uuid要重新生成一个。

先停止mysql服务:systemctl stop mysqld,再清空/var/lib/mysql文件夹下的所有文件和文件夹,所有的数据库信息都在这里包括root的密码。启动mysql服务:systemctl start mysqld。此时就会重新生成一个uuid。

如果之前配置过异步复制的slave信息,要在mysql里清除这些配置信息,用:reset slave;

如果要清除主配置信息,用:reset master;

设置配置文件/etc/my.cnf.d/mysql-server.cnf:

server_id=1     #所有数据库的配置文件中这个值不能相同。

gtid_mode=ON    #开启基于事务GTID的复制功能。

enforce_gtid_consistency=ON    #开启GTID功能

master_info_repository=TABLE     #MGR需要多源复制功能,所以需要将主从库之间的信息记录到表中。

relay_log_info_repository=TABLE   #同上

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW    #基于行规则复制。

plugin_load_add='group_replication.so'    #安装组复制插件

transaction_write_set_extraction=XXHASH64   #指示服务器对于每个事务,它必须手机写集并使用XXHASH64散列算法将其编码为散列,从mysql8.0.2开始,此设置是默认设置,可以省略。

loose-group_replication_group_name='3be1d3c9-d7e5-11ec-9244-000c29949fef'       #组名称,必须是uuid格式的值,上面记录的那个可以拿过来用,也可以用select uuid()生成一个。

loose-group_replication_start_on_boot=OFF   #配置自动加入组,这在设置组复制时很重要,因为它确保您可以在手动启动插件之前配置服务器。配置成功后,可以设置这个参数为ON,以便在数据库启动后自动启动Grop_Replication。

loose-group_replication_local_address="192.168.40.90:33061"   #设置本机的ip地址和监听端口,这个IP地址是外网地址,如果不是一个网段的地址,会出现连不上的问题,此时可以用ifconfig命令看到的普通网卡的名称,这里是【eth0】,执行命令:ifconfig eth0:1 **.**.**.**【这里的**.**.**.**是外网地址】。报错内容:"Timeout while waiting for the group communication engine to be ready!"

"The group communication engine is not ready for the member to join. Local port: 33061"

loose-group_replication_group_seeds="192.168.40.90:33061,192.168.40.91:33061,192.168.40.92:33061"    #所有组复制的节点ip及它们的监听端口,这里也是写外网地址。

loose-group_replication_bootstrap_group=off

loose-group_replication_ip_whitelist="127.0.0.1/8,192.168.40.0/24"    #把指定网段的ip加入白名单中,如果是指定ip地址就直接写,如果是一个范围内就写范围。

loose-group_replication_single_primary_mode=OFF     #这个参数决定是单主(ON)还是多主(OFF),默认单主。

# 在多主模式下部署时,将检查语句以确保他们与该模式兼容。在多主模式下部署组复制时,将进行以下检查:

#    --如果事务是在SERIALIZABLE隔离级别下执行的,则在与组同步时,其提交将失败。

#    --如果事务是针对具有级联约束的外键的表执行的,则该事务在与组同步时将无法提交。

# 这些检查可以通过设置选项来禁用group_replication_enforce_update_everywhere_checks到OFF。在单主模式下部署时,此选项必须设置为OFF。

loose-group_replication_enforce_update_everywhere_checks=ON

单主模式:

如果所有的节点都被停止,且设置的自动启动组复制,则开启一个节点后,会自动启动组复制,但是它找不到主节点,所以会启动失败,此时就需要先运行使用配置参数的语句进行初始化,然后再启动组复制,这时候这个节点就成了主节点,后面所有节点数据库启动后,因为能找到主节点且能连上,所以就会正常启动组复制。

设置配置文件中:loose-group_replication_single_primary_mode=ON

loose-group_replication_enforce_update_everywhere_checks=OFF

启动mysql服务。

查看root用户的初始密码,mysql8的初始密码是空,直接输入mysql就可以进去,其它的查看方法:cat /var/log/mysqld.log | grep password。

进入mysql。

修改root用户密码【选择使用】:alter user root@localhost identified by 'XIAOzhao123';

在所有节点数据库中执行:

set sql_log_bin=0;    #关闭日志功能,新建用户的操作不想让其它节点获取。

create user zhao@'%' identified by 'Zhao123!@#';    #新建用户zhao,权限是%表示任何位置都可以远程登录,密码是Zhao123!@#。

grant replication slave on *.* to zhao@'%';         #为用户zhao增加复制权限。

flush privileges;        #刷新。

set sql_log_bin=1;     #开启日志功能。

change master to master_user='zhao',master_password='Zhao123!@#' for channel 'group_replication_recovery';   #配置通道信息和用户信息。

set global group_replication_bootstrap_group=on;    #开启配置参数,这一句只在第一个节点执行,其他节点都会直接用这里配置的信息。执行这个语句的节点会成为主节点。

start group_replication;           #启动组复制功能。

set global group_replication_bootstrap_group=off;   #关闭配置参数,这一句只在第一个节点执行。

select * from performance_schema.replication_group_members;     #查看节点是否部署成功,状态是ONLINE就说明是正常的,其他状态都是有问题。

# PRIMARY表示这个是主节点,SECONDARY表示这个是从节点。

最终效果:

+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+

| CHANNEL_NAME      | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBR_STATE  | MEMBER_ROLE | MEMBER_VERSION |

+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+

| group_replication | 861ab148-df63-11ec-8832-000c2980ed69 | node1        |       3306  | ONLINE       | PRIMARY     | 8.0.26         |

| group_replication | ac3b5585-df63-11ec-8e33-000c29614740 | node2        |       3306  | ONLINE       | SECONDARY   | 8.0.26         |

| group_replication | bd129ac6-df63-11ec-bd99-000c295647bd | node3        |       3306  | ONLINE       | SECONDARY   | 8.0.26         |

+-------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+

停止组复制功能:stop group_replication;如果是主数据库停止了,则下一个从数据库会自动转换为主数据库,这个曾经的主数据库重新启动后会变成从数据库。

如果查询部署的节点发现从数据库的MEMBER_STATE状态值为RECOVERING(恢复),说明主数据库有和从数据库不一样的数据且没有被写入执行日志中,所以从数据库比较出来差异了但是找不到原始数据执行,所以就一直处于恢复状态了。

如果配置文件中写安装插件了,就不用再执行那个安装语句了,否则安装的时候会显示这个功能已经存在。

在启动组复制功能:start group_replication;时一直报错,有一次在日志文件中看到提示:Error connecting to the local group communication engine instance,解决方式是修改/etc/selinux/config文件中的SELINUX=disabled,这个好像是关闭安全策略,需要看有没有开启后还能启动的方式,原始值是:enforcing。

启动组复制时要先清除master的配置,用reset master命令。还要停止从数据库的slave。不然会启动不起来还报错。

设置为单主模式后,从数据库服务器会被自动设置为只读状态,不可在从数据库服务器里进行增删改操作,执行select @@read_only;语句可以查看数据库只读状态。

数据库为只读状态时执行增删改语句会提示错误信息:ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

如果在navicat中连接上mysql后发现只有一个数据库information_schema,说明当前用户没有太多权限。

执行语句:show grants for zhao;可以查看用户zhao的权限。

执行语句:grant all privileges on *.* to zhao;可以为用户zhao设置所有权限,此时重新连接mysql就可以看到别的数据库了。

思考,四种复制方法,如果主从数据库的数据不一致了,应该怎么处理呢?

解决方案:如果是组复制模式,因为无法改变日志节点编号,所以只能是先备份binlog日志,然后进入数据库执行reset master;命令初始化binlog日志,停止数据库服务(防止持续被写入数据),然后备份数据库,再然后启动数据库,不影响主数据库的使用。最后到从数据库中执行备份文件,再开启组复制模式,此时从数据库就会从主库的binlog日志中重新同步数据了。

注意:如果不是使用mysql命令创建数据库,binlog日志中不会出现创建数据库的语句,同步的时候可能会出现未知的数据库错误,在遇到这种情况时可以在从数据库里创建好查不到的那个数据库,然后同步,具体试过一次,没有成功。

多主模式:

多主模式中所有的数据库节点都是主节点,任何一个主节点中执行了增删改操作,其它节点都会同步。

设置配置文件中:loose-group_replication_single_primary_mode=OFF

loose-group_replication_enforce_update_everywhere_checks=ON

后面的和单主都一样。查询的效果:

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+

| group_replication_applier | 0d7db34a-55bc-11ed-a4b6-000c29aea539 | node2       |        3306 | ONLINE       | PRIMARY     | 8.0.26         |

| group_replication_applier | 3d08144f-55ba-11ed-aef4-000c29d562d5 | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.26         |

+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+


友情链接  LINKS

扫码加微信

关注公众号

河南龙祥软件科技有限公司

联系电话:18236995786(微信同号)

公司地址:河南省郑州市登封市君召乡陈爻

备案号:豫ICP备3306-91号

营业执照

0.068320s