MYSQL 8.0.X 外置迁移
MYSQL 外置迁移操作,会造成 ONES 服务短暂不可用
配置参数
配置项 | 类型 | 示例 | 描述 |
---|---|---|---|
mysql_host | string | "10.15.10.203" | mysql服务器ip |
mysql_port | string | "3306" | mysql服务端口 |
mysql_password | string | "xxxxxxx" | mysql ones 用户密码 |
is_use_independence_mysql | boolean | true | 是否使用外置数据库 |
is_use_independence_mysql8 | boolean | true | 是否使用外置数据库 mysql 8.x |
环境准备
按照以下的 my.cnf 配置文件准备一个 mysql 实例,客户侧必须提前准备好外置的数据库,MySQL 版本 8.0.X
数据库必须是独立实例(不能与其他应用混在一起,否则会影响部署)
考虑到性能压力,mysql 实例的机器资源建议按 ones 的一半来配置,后续也要能够进行方便的调整
my.cnf 配置文件
[client]
port=3306
#socket = /tmp/mysql.sock
default-character-set=utf8mb4
[mysqld]
default_authentication_plugin=mysql_native_password
skip_ssl # 关闭ssl验证
# port=3306
# socket=/tmp/mysql.sock
socket=/var/lib/mysql/mysql.sock
# basedir=/usr/local/mysql
# datadir=/data/mysql
# pid-file=/data/mysql/mysql.pid
user=mysql
server-id=1
log-bin=mysql-bin
log_slave_updates=on #从服务器将时间记录到二进制日志中
auto_increment_increment=1 #自动增长的步长
auto_increment_offset=1
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
performance_schema_max_table_instances=200
table_definition_cache=200
table_open_cache=128
# log_error=/data/log/mysql/mysql-error.log
# lc-messages-dir=/usr/share/mysql/english/
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
bind-address=0.0.0.0
skip-name-resolve
back_log=600
max_connections=1000
max_connect_errors=6000
open_files_limit=65535
max_allowed_packet=512M
binlog_cache_size=1M
max_heap_table_size=8M
tmp_table_size=16M
read_buffer_size=2M
read_rnd_buffer_size=8M
sort_buffer_size=8M
join_buffer_size=8M
thread_cache_size=8
# query_cache_size=8M
# query_cache_limit=2M
key_buffer_size=4M
ft_min_word_len=4
transaction_isolation=REPEATABLE-READ
log_bin=mysql-bin
binlog_format=row
expire_logs_days=7
slow_query_log=1
long_query_time=1
#slow_query_log_file=/data/log/mysql/mysql-slow.log
performance_schema=0
explicit_defaults_for_timestamp
skip-external-locking
default-storage-engine=InnoDB
innodb_file_per_table=1
innodb_open_files=500
innodb_buffer_pool_size=2048M
innodb_write_io_threads=4
innodb_read_io_threads=4
innodb_thread_concurrency=0
innodb_purge_threads=1
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=2M
innodb_log_file_size=32M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
bulk_insert_buffer_size=8M
interactive_timeout=28800
wait_timeout=28800
net_read_timeout=600
net_write_timeout=600
log_slow_extra=ON
eq_range_index_dive_limit=5000
#GTID:
gtid_mode=on
enforce_gtid_consistency=on
session_track_gtids=OWN_GTID
session_track_state_change=ON
[mysqldump]
quick
max_allowed_packet=1024M
外置数据库创建 ones 用户并授权
使用 root 用户登录外置数据库
mysql -uroot -p<password>
创建 ones 用户并授权
<mysql_password><mysql_open_platform_password>
需要和ones config.json
配置文件中的mysql_password
、mysql_open_platform_password
一致
CREATE USER 'ones'@'%' IDENTIFIED BY <mysql_password>;
GRANT ALL PRIVILEGES ON *.* TO 'ones'@'%' WITH GRANT OPTION;
CREATE USER 'openplatform'@'%' IDENTIFIED BY <mysql_open_platform_password>;
GRANT ALL PRIVILEGES ON *.* TO 'openplatform'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
操作步骤
数据备份
检查外置数据库配置
登陆 ONES 服务器,进入当前运行中实例的安装目录
cd /data/ones/pkg/ones-example-3.14.xxxxx
进入容器
./onesconfigure e
使用 ones 用户连接外置数据库
mysql_password 需要和 ones config.json 配置文件中的 mysql_password 一致
mysql -uones -p<mysql_password> -h<mysql_host> -P<mysql_port>
查看数据库配置,ones 提供的配置里table_open_cache
的值是 128
SHOW VARIABLES LIKE '%table_open_cache%';
输出示例
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| table_open_cache | 128 |
| table_open_cache_instances | 16 |
+----------------------------+-------+
验证完成后,退出mysql
以及容器
exit
exit
开始外置迁移
- 登陆 ONES 服务器,进入当前运行中实例的安装目录
cd /data/ones/pkg/ones-example-3.14.xxxxx
- 执行
common.sh
脚本,交互页面选择30
选项
执行后此时会有一个交互的过程,要求输入
mysqlhost
和mysqlport
,此时先不要输入!!
进入 screen 终端,如果提示 screen 不存在,yum install screen -y
安装 screen
该脚本会将当前运行实例的数据库导出为 db.tar
sudo screen -S ones
sudo bash common.sh
- 新开一个终端,进入安装目录
手动将外置 mysql8.0 上相关的组件拷贝到 ONES 容器内
ONES 容器内的 mysqldump 组件和相关依赖版本和 mysql8.0 匹配不上,需要手动将外置 mysql8.0 上相关的组件拷贝到 ONES 容器内,开始迁移前需要先完成下面的配置
登陆 ONES 服务器,进入当前运行中实例的安装目录
cd /data/ones/pkg/ones-example-3.14.xxxxx
获取容器 ID
containerID=$(docker ps |grep $(./json-util -config config.json -operator select -key deploy_name) | grep '0.0.0.0:'$(./json-util -operator select -key port -config ./config.json)'->' | awk '{print $1}')
下载 mysqldump 组件和相关依赖
curl -O https://res.ones.pro/script/private_scripts/kaitaitmp/mysqlfile.tar.gz
mv ./mysqlfile.tar.gz /tmp
tar -zvxf /tmp/mysqlfile.tar.gz
tar vxf /tmp/mysqlfile.tar
docker cp /tmp/tmp $containerID:/tmp
docker cp /tmp/mysqldump $containerID:/usr/bin/
容器内文件做软链
docker exec -it $containerID bash
cd /tmp/tmp
cp ./* /usr/lib64
ln -s /usr/lib64/.libssl.so.1.1.1k.hmac /usr/lib64/.libssl.so.1.1.hmac
ln -s /usr/lib64/libssl.so.1.1.1k /usr/lib64/libssl.so.1.1
ln -s /usr/lib64/libcrypto.so.1.1.1k /usr/lib64/libcrypto.so.1.1
ln -s /usr/lib64/.libcrypto.so.1.1.1k.hmac /usr/lib64/.libcrypto.so.1.1.hmac
- 连接外置数据库
mysql -uones -h<mysql_host> -P<mysql_port> -p<mysql_password>
- 导入数据
common 脚本会自动拷贝
db.tar
一份进入容器内,所以不需要手动拷贝
create database project;
create database wiki;
create database wizeditor;
create database superset;
create database camunda;
create database open_platform_plugin;
create database plugin_platform;
use project;
source /root/ones/project.sql;
use wiki;
source /root/ones/wiki.sql;
use wizeditor;
source /root/ones/wizeditor.sql;
use superset;
source /root/ones/superset.sql;
use camunda;
source /root/ones/camunda.sql;
use open_platform_plugin;
source /root/ones/open_platform_plugin.sql;
use plugin_platform;
source /root/ones/plugin_platform.sql;
- 数据导入完成后,回到第二步的输入
mysqlhost
和mysqlport
,输入完成后即可等待执行,过程有其他中断报错可以及时联系 ONES 的工程师
检查
在完成外置数据库迁移后,还需要进行检查和数据测试
- 在最新的安装包目录下,执行
./onesconfigure ss
查询看是否还存在mysql
进程,如果没有则正常
./onesconfigure ss
- 在页面创建一个新的项目和任务,以英文命名,然后在数据库执行
select * from project.task where summary like '%英文名%'
,有信息则为正常
# 进入 mysql
./onesconfigure mysql
select * from project.task where summary like '%英文名%'
故障排查
执行 common.sh 脚本 30 选项时,终端断了,如何继续执行?
文档在该步骤前有一个进入 screen 终端的操作,如果执行了该操作,可以通过以下命令进入 screen 终端
screen -r ones
如果不幸你没有进入 screen 终端,这时候请先将当前安装目录下的 db.tar 备份一份,然后重新执行 common.sh 脚本,选择 30 选项
因为后续步骤会将 mysql 8 的相关组件拷贝进容器,此时再导出数据库会报错,所以需要先备份一份 db.tar
后续步骤需要将备份的 db.tar 手动拷贝进容器,然后执行导入数据库的操作
cp db.tar /tmp