腾讯云Mysql8.0主从同步遇到的坑

记录我用腾讯云做主从同步遇到的各种坑

文章目录

    • 记录我用腾讯云做主从同步遇到的各种坑
  • 前言
  • 一、背景
  • 二、注意点
  • 三、使用步骤
    • 1.从库搭建mysql8.0数据库
    • 2.备份和同步数据
  • 总结


前言

为保证公司数据安全,很多公司很有可能需要做mysql主从同步本篇文章记录我在工作中使用腾讯云做主从同步遇到的各种坑。我用的是mysql8.0版本


提示:以下是本篇文章正文内容,下面案例可供参考

一、背景

1.此篇文章介绍使用腾讯云将云上数据实时备份到云下机房。
2.我的主库是腾讯云买的数据库,从库是公司机房。mysql8.0版本

二、注意点

为保证数据恢复正常,及主从同步成功请最好保证主库和从库版本一致。保证percona版本和数据库一致,否则数据恢复会出问题。

三、使用步骤

1.从库搭建mysql8.0数据库

命令如下:
1.1 yum方式搭建mysql8.0 需要能联网
1)清除系统默认或之前可能安装的其他版本的mysql

[root@DB-node01 ~]# for i in $(rpm -qa|grep mysql);do rpm -e $i --nodeps;done
[root@DB-node01 ~]# rm -rf /var/lib/mysql && rm -rf /etc/my.cnf

2)安装Mysql8.0 的yum资源库
mysql80-community-release-el7-1.noarch.rpm    下载地址:  https://pan.baidu.com/s/1QzYaSnzAQeTqAmk8FE9doA
提取密码: 2maw
[root@DB-node01 ~]# yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
3) 安装Mysql8.0
[root@DB-node01 ~]# yum install mysql-community-server
   
启动MySQL服务器和MySQL的自动启动
[root@DB-node01 ~]# systemctl start mysqld
[root@DB-node01 ~]# systemctl enable mysqld
   
4) 使用默认密码初次登录后, 必须要重置密码
   
查看默认密码, 如下默认密码为"e53xDalx.*dE"
[root@DB-node01 ~]# grep 'temporary password' /var/log/mysqld.log
2019-03-06T01:53:19.897262Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: fr3xad23fh*E
   
[root@DB-node01 ~]# mysql -pfr3xad23fh*E
............
mysql> select version();
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
   
报错提示必须要重置初始密码, 下面开始重置mysql登录密码(注意要切换到mysql数据库,使用use mysql)
mysql> use mysql;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
   
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
   
这个其实与validate_password_policy的值有关, mysql8.0更改了validate_password_policy相关的配置名称, 这跟Mysql5.7有点不一样了.
mysql> set global validate_password.policy=0;
Query OK, 0 rows affected (0.00 sec)
   
mysql> set global validate_password.length=1;
Query OK, 0 rows affected (0.00 sec)
   
接着再修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.05 sec)
   
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
   
退出, 重新使用新密码登录mysql
[root@DB-node01 ~]# mysql -p123456
...........
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.15    |
+-----------+
1 row in set (0.00 sec)
5)然后,请关闭mysql服务,不然
在后面启动的我们的/data下面的数据库会报 port已经被占用的错
[root@DB-node01 ~]# systemctl stop mysqld
[root@DB-node01 ~]# systemctl status mysqld

**1.2 二进制方式搭建mysql8.0 **

 1)下载安装包 
https://dev.mysql.com/downloads/file/
可以用ftp上传到linux上
2)解压文件 
tar  -xvf mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
3)添加系统mysql组和mysql用户:
groupadd mysql
useradd -g mysql mysql
groupadd mysql
4)将解压后的文件移动到安装目录 并重命名
mv  mysql-8.0.16-linux-glibc2.12-x86_64   /usr/local/mysql
5)将mysql目录的所有者更换为mysql用户
chown -R mysql:mysql /usr/local/mysql
6)创建配置文件相关目录
cd  /usr/local/mysql
mkdir -p {data,binlogs,log,etc,run}
7)修改配置目录的权限
chown -R mysql:mysql ./{data,binlogs,log,etc,run}
8)编写配置文件
注意:query_cache_type = 0 query_cache_size = 0 将这两行注释掉,此配置文件不是精确,请自行选择
vim /usr/local/mysql/etc/my.cnf
[client]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
 
[mysqld]
port = 3306
socket = /usr/local/mysql/run/mysql.sock
pid_file = /usr/local/mysql/run/mysql.pid
datadir = /usr/local/mysql/data
default_storage_engine = InnoDB
max_allowed_packet = 512M
max_connections = 2048
open_files_limit = 65535
 
skip-name-resolve
lower_case_table_names=1
 
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
 
 
innodb_buffer_pool_size = 1024M
innodb_log_file_size = 2048M
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 0
 
 
key_buffer_size = 64M
 
log-error = /usr/local/mysql/log/mysql_error.log
log-bin = /usr/local/mysql/binlogs/mysql-bin
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/log/mysql_slow_query.log
long_query_time = 5
 
 
tmp_table_size = 32M
max_heap_table_size = 32M
 
server-id=1
*9) 初始化数据库*
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
*10) 设置启动文件和环境变量*{mysql}/ support-files/mysql.server 拷贝为/etc/init.d/mysql并设置运行权限,这样就可以使用service mysql命令启动/停止服务
cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysql
注册启动服务:
chkconfig --add mysql
查看是否添加成功
chkconfig --list
显示:mysqld          0:off  1:off  2:on  3:on  4:on 5:on  6:off
环境变量:
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
*11)启动mysql数据库命令*
systemctl start mysql
systemctl stop mysql
systemctl restart mysql
12) 也需要修改密码和1.1yum方式一样这里省略
13)关闭mysql服务,systemctl  stop mysql

2.备份和同步数据

2.1 物理备份数据库
命令如下:

前提条件
下载并安装 XtraBackup 工具。
下载地址请参见 Percona XtraBackup 官网,请选择 Percona XtraBackup 2.4.6 及以上的版本,安装介绍请参见 Percona XtraBackup 2.4。安装好后  cp bin目录下的所有  到/usr/bin下面就好了,不用启动percona的
支持的实例版本:MySQL 双节点、三节点。
启用数据加密功能的实例,不支持使用物理备份恢复数据库。
操作步骤
说明:
本文以 CentOS 操作系统的云服务器和 MySQL 5.7 版本为例进行演示。
步骤1:下载备份文件
您可通过控制台下载云数据库 MySQL 的数据备份、日志备份。
说明:
默认每个 IP 限制10个链接,每个链接下载速度可达20Mpbs - 30Mpbs。

登录 MySQL 控制台,在实例列表,单击实例 ID 或“操作”列的【管理】,进入实例管理页面。
在实例管理页面,选择【备份恢复】>【数据备份列表】页, 选择需要下载的备份,在“操作”列单击【下载】。
在弹出的对话框,推荐您复制下载地址,并 登录到云数据库所在 VPC 下的 CVM(Linux 系统) 中,运用 wget 命令进行内网高速下载,更高效。
说明:
您也可以选择【本地下载】直接下载,但耗时较多。
wget 命令格式:wget -c '备份文件下载地址' -O 自定义文件名.xb
示例如下:
wget -c 'https://mysql-database-backup-sh-1218.cos.ap-nanjing.myqcloud.com/12427%2Fmysql%2F0674-ffba-11e9-b592-70bd%2Fdata%2Fautomatic-delete%2F2019-12-03%2Fautomatic%2Fxtrabackup%2Fbk_61_156758150%2Fcdb-293fl9ya_backup_20191203000202.xb?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKzxfbLJ1%26q-sign-time%3D1575374119%3B1575417319%26q-key-time%3D1575374119%3B1575417319%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Dba959757&response-content-disposition=attachment%3Bfilename%3D%22yuan177685_backup_20191203000202.xb%22&response-content-type=application%2Foctet-stream' -O ~/test.xb
步骤2:恢复数据
2.1 解包备份文件
使用 xbstream 命令将备份文件解包到目标目录。
xbstream -x -C /data < ~/test.xb
说明:
本文目标目录以/data为例,您可根据实际情况替换为实际路径。
~/test.xb替换为您的备份文件。
解包结果如下图所示:
extract.png
2.2 解压备份文件
通过如下命令下载 qpress 工具。
wget http://www.quicklz.com/qpress-11-linux-x64.tar
说明:
若 wget 下载提示错误,您可至 quicklz 下载 qpress 工具到本地后,再将 qpress 工具上传至 Linux 云服务器,请参见 通过 SCP 上传文件到 Linux 云服务器。
通过如下命令解压出 qpress 二进制文件。
tar -xf qpress-11-linux-x64.tar -C /usr/local/bin
source /etc/profile
使用如下命令将目标目录下所有以.qp结尾的文件都解压出来。
xtrabackup --decompress --target-dir=/data
说明:
/data为之前存储备份文件的目标目录 ,您可根据实际情况替换为实际路径。
Percona Xtrabackup 在2.4.6及以上版本中才支持--remove-original选项。 我用了 --remove-original
xtrabackup默认在解压缩时不删除原始的压缩文件,若需解压完删除原始的压缩文件,可在上面的命令中加上--remove-original参数。
decompress.png
2.3 Prepare 备份文件
#备份解压出来之后,执行如下命令进行 apply log 操作。
xtrabackup --prepare  --target-dir=/data
#如果你用的percona版本不是8.0的,也会prepare不成功,我遇到的问题:报no valid  checkpoint found   error  failed。所以如果2.4以上不行请重新下载8.0版本的percona
#执行后若结果中包含如下输出,则表示 prepare 成功。
**cat  /data/xtrabackup_binlog_info
mysql-bin000388   196**   
2.4 修改配置文件
执行如下命令打开backup-my.cnf文件。
vi /data/backup-my.cnf
说明:
本文以目标目录/data为例,您可以根据实际情况将其替换成实际路径。
由于存在的版本问题,请将解压文件backup-my.cnf中如下参数进行注释。
innodb_checksum_algorithm
innodb_log_checksum_algorithm
innodb_fast_checksum
innodb_page_size
innodb_log_block_size
redo_log_version 
![实际我做的时候只是注释了server_uuid和master_key_id,并修改了serverid=2](https://img-blog.csdnimg.cn/8835ec6092b145028cb019e21cb9b50e.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTkxMjc0NQ==,size_16,color_FFFFFF,t_70#pic_center)
2.5 修改文件属性
修改文件属性,并检查文件所属为 mysql 用户。
chown -R mysql:mysql /data
步骤3:启动 mysqld 进程并登录验证(请保证你之前部署的mysql服务已经关闭)
启动 mysqld 进程。
mysqld_safe --defaults-file=/data/backup-my.cnf --user=mysql --datadir=/data &
#这里如果是yum安装的mysql  请用mysqld启动,因为yum安装没有mysqld_safe命令。
#我遇到的问题:查看/usr/local/log/err*.log 或者查看/data/APP.err journalctl -xe发现报错port 3306已被占用 原因就是之前你部署mysql的时候没关闭mysql
ss -ntl 命令看到3306就表明成功了。服务器控制台会处于监听状态,是正常的。
客户端登录 mysql 验证。用navicat验证,或者在从库执行./mysql -p,能进去看到库表明成功了
mysql  -uroot

2.2 同步数据
我这里一开始用navicat连接从库做主从同步,碰到坑了。

2.2.1主从同步,在从库执行
CHANGE MASTER TO
MASTER_HOST='gz-cdb-你主库的腾讯云域名地址.com',
MASTER_USER='repl_user你的有主库同步权限的用户',
MASTER_PASSWORD='上面主库用户的密码',
master_log_file='mysql-bin.000388前面2.3 Prepare 备份文件里有查看到binlog',
master_log_pos=196,
master_port=3306;
报错了 navicat 报ERROR 1227 : Access denied; you need (at least one of) the SUPER privilege(s) or REPLICATION_SLAVE_ADMIN privilege(s)  for this operation
这个时候你会发现网上没有任何解决这个问题的办法。大部分说是主库的用户没有replication slave权限,实际我不是这个问题,因为我的用户是超级用户。。于是我定位是从库权限的问题,但是这段navicat给的1227信息根本解决不了问题。于是我灵机一动进到从库服务器里执行上面change命令发现,报这个ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operat。这个时候看到42000代码问题解决了方案如下:
1). update user set Super_priv=‘Y’ where User=‘root’
2). flush privileges
#如果报错,请将单引号改成双引号
再次执行change命令
2.2.2开启slave
start slave;
show slave status ;
这个时候发现slave_IO_RUNNING :connecting  sql_IO_RUNNING:yes
问题出在哪呢。你就要看lasterror信息。我的问题是端口错了,腾讯云外网域名的端口不是3306,内网才是3306.我的是10000于是更改
CHANGE MASTER TO
MASTER_HOST='gz-cdb-你主库的腾讯云域名地址.com',
MASTER_USER='repl_user你的有主库同步权限的用户',
MASTER_PASSWORD='上面主库用户的密码',
master_log_file='mysql-bin.000388前面2.3 Prepare 备份文件里有查看到binlog',
master_log_pos=196,
master_port=10000;
start slave;
show slave status ;
又报错了:slave_IO_RUNNING :NO  sql_IO_RUNNING:yes
show slave status ;查看lasteror信息或者查看APP.err发现是gtid未开启
于是修改cnf文件添加enforcegtid***=on 和gtid参数=on,重新启动mysql ok了
如果你show slave status ;又报错了slave_IO_RUNNING :NO  sql_IO_RUNNING:yes
那有可能是pos位置错了,请联系腾讯云客服他们知道正确的pos位置
看到slave_IO_RUNNING :yes  sql_IO_RUNNING:yes就表明同步成功了

腾讯云购买


总结

参考文章:mysql8.0部署
腾讯云数据库备份

你可能感兴趣的:(腾讯云主从/备同步,ubuntu,centos,腾讯云,dba)