原库:*.*.101.73/74
系统环境: Suse 12.4
MySQL: 5.7.29
新库:*.*.110.46/47
系统环境:CentOS7.7 64位
MySQL版本: 5.7.30
因业务侧在*.*.101.73/74 mysql数据库服务器上部署了java应用程序、Hadoop+Hbase数据库等大数据环境,导致主机内存突然暴增告急,经双方排查,发现数据库进程本身才占用内存8.5%,大部分都是由应用缓存占用了内存。经与局方及业务侧沟通,局方敦促业务侧将数据库服务器从73/74服务器迁移到*.*.110.46/47服务器上,我方负责实施数据库的迁移操作。
本次迁移使用的MySQL自带的备份工具mysqldump从原库双主(*.*.101.73/74)导出数据,通过nfs共享文件系统上传到资源池新库双主(*.*.110.46/47)。
在资源池新库分别将73、74数据库的备份文件导入 46、47新库,并启动双主复制进程:
mysql> change master to master_host=*.*.110.46,master_user=repl,master_password=xxxxxx,master_port=3306,master_auto_position=1;
结果报错如下:
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
从报错信息来看,起初以为是执行复制的语句重复制账号信息有误,然后核对了repl账号的口令是正确的,并查看了复制账号repl的权限信息:
mysql>show grants for ‘repl’@’*.*.110.%’;
结果显示没有repl用户的权限信息记录。接着查看系统表user中数据信息,竟然没有导入数据前创建的repl用户记录,哦,奇怪。
突然想到,由于我们备份的是原库中所有表(--all-databases),导出的dump文件中包含有重新创建表结构的语句,所以马上在资源池双主库新建复制账号repl:
grant replication slave on *.* to repl@*.*.110.% identified by xxxxxx;
flush privileges;
然后重新执行复制语句并开启复制进程依然报刚才的错。然后就想到此次迁移是从Suse 12.4 MySQL-5.7.29 迁移到CentOS7.7 MySQL-5.7.30, 以为是版本不兼容。
接着将资源池46/47的MySQL版本降为 mysql 5.7.29。分别重新导入数据到新库46/47上,导入数据库的过程中46服务器导入正常,而发现47库上通过source导入时非常的慢,每条执行返回10-30秒,当时没有查具体原因,有可能是网络卡顿吧。
最后查看原库74/74的数据库配置文件,返现没有开启GTID全局复制方式(说明,目前这边项目MySQL数据库几乎都使用的基于GTID全局事务复制协议做的同步),而我执行的复制语句中有“master_auto_position=1”,原来新库上执行的复制机制跟原库不一致,这就是刚才开启复制进程报错的根本原因。
通过以上分析,我们得知,既然原库使用的是binlog和pos做的同步,那么我们新库也同样按照这个方式来配置复制。其次由于刚才使用mysql内置工具导入数据时很缓慢,所以我们准备采用percona提供的xtrabackup 工具来做数据备份和恢复。
create user bkuser@localhost identified by xxxxxx;
grant reload,lock tables,replication client,process on *.* to bkuser@localhost;
flush privileges;
73服务器上:
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --host=*.*.101.73 --user=bkuser --password=xxxxxx --port=3306 --socket=/app/gzyd/data/mysql/tmp/mysql.sock --no-timestamp /mysqlbackup/73_xtra_base_20200623
74服务器上:
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --host=*.*.101.74 --user=bkuser --password=xxxxxx --port=3306 --socket=/app/gzyd/data/mysql/tmp/mysql.sock --no-timestamp /mysqlbackup/74_xtra_base_20200623
# 46/47库上执行
mysql> flush table with read lock;
mysql> show master status;
注:记得记录下master状态信息,后面执行复制的时候要用到。
mysql> unlock table;
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --use-memory=2G --apply-log /mysqlbackup/73_xtra_base_20200623
mysqladmin --login-path=myconn shutdown immediate
mv /data/mysql/data /data/mysql/data-bak20200624
mkdir /data/mysql/data
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --copy-back /mysqlbackup/73_xtra_base_20200623
chown -R mysql.mysql /data/mysql/data
mysqld_safe --defaults-file=/home/mysql/my_cnf/my.cnf &
grant replication slave on *.* to repl@*.*.110.% identified by xxxxxx;
flush privileges;
2)配置46->47方向主从
登录47服务器,执行复制语句:
stop slave;
change master to master_host=*.*.110.46,master_user=repl,master_password=xxxxxx,master_port=3306,master_log_file=bin.000001,master_log_pos=448;
start slave;
show slave statusG;
登录46服务器,执行复制语句:
stop slave;
change master to master_host=*.*.110.47,master_user=repl,master_password=repQAv2wsx@gzydxk,master_port=3306,master_log_file=bin.000001,master_log_pos=1066;
start slave;
show slave statusG;
mysql> create database chg;
mysql> use chg;
mysql> create table t1(id int, name varchar(30));
mysql> insert into t1(id,name) values(1,zhangsan);
mysql> insert into t1(id,name) values(2,lisi);
然后到重复47上查看新插入的两条数据是否同步过来:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| chg |
| mysql |
| performance_schema |
| smzrz |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use chg;
mysql> show tables;
+---------------+
| Tables_in_chg |
+---------------+
| t1 |
+---------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)
mysql> create database chg2;
mysql> use chg2;
mysql> create table t2(id int,name varchar(20));
mysql> insert into t2(id,name) values(1,derek);
mysql> insert into t2(id,name) values(2,john);
然后到重复47上查看新插入的两条数据是否同步过来:
mysql> use chg2;
mysql> show tables;
+----------------+
| Tables_in_chg2 |
+----------------+
| t2 |
+----------------+
1 row in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id | name |
+------+-------+
| 1 | derek |
| 2 | john |
+------+-------+
MySQL数据库类似的升级迁移操作注意事项:
①升级迁移操作前仔细检查当前数据库配置文件(my,cnf),关注关键性的参数配置。
②自此检查数据库的架构,如:具体使用哪种复制模式等。
③升级迁移变更前做好充分的数据测试。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/130129.html
摘要:今天遇到了一个错误,翻译一下就是堆栈溢出,很好奇就是一个简单请求怎么会报这个错误,研究了一下,发现犯了一个很低级的错误,的参数错误了是未定义的变量,值为空,然后导致了这个问题,但是为什么,暂时还没有搞明白,如果哪位对源代码比较熟悉,知道是怎 今天遇到了一个错误, showImg(https://segmentfault.com/img/bVHYYa?w=1424&h=233);翻译一下...
摘要:好啦,再次大功告成。由万维网协会研制,它为用户提供了对自己公开信息的更多的控制。支持的站点可以为浏览者声明他们的隐私策略。果然在浏览器中打开设置隐私阻止永不,打开上述设置之后,跨域种瞬间成功。 前段时间开发了一个用户登录的模块,需求很简单,用户输入手机号和验证码,我们就会返回给用户一套身份信息并保存在cookie里面。so easy,于是就有以下代码: // 大致意思如下,并非真实模块...
摘要:前者集成在中,后者主要是为微信用户提供了另一种支付方式需要在微信的内置浏览器中打开页面,再调起微信支付。步骤商户后台收到用户支付单,调用微信支付统一下单接口。拿到所有参数后,就可以在页面中发起微信支付的请求了。 微信支付,支持的支付方式比较多:有扫码支付,刷卡支付,APP支付和公众号支付。其中,APP和网站上最常用的就是APP支付和公众号支付。前者集成在APP中,后者主要是为微信用户提...
摘要:原文地址支付支付步骤为获取支付宝的配置信息。将得到的数据请求支付宝客户端进行支付。端将拼接好的字符串拿去请求支付宝客户端即可调起支付宝进行支付。向支付宝申请新订单,获取支付。成功请求回来后,就可以向支付宝发出一次支付请求。 支付宝在所有支付方式中最好开发的了,因为文档比较清晰,而且开发起来也比较简单。因此,支付宝的坑是相对较少的。原文地址 APP支付 APP支付步骤为: 获取支付宝的...
阅读 1355·2023-01-11 13:20
阅读 1705·2023-01-11 13:20
阅读 1214·2023-01-11 13:20
阅读 1906·2023-01-11 13:20
阅读 4164·2023-01-11 13:20
阅读 2754·2023-01-11 13:20
阅读 1399·2023-01-11 13:20
阅读 3670·2023-01-11 13:20