Skip to main content
Version: v3&v6

MYSQL 8.0.X 外置迁移

MYSQL 外置迁移操作,会造成 ONES 服务短暂不可用

配置参数

配置项类型示例描述
mysql_hoststring"10.15.10.203"mysql服务器ip
mysql_portstring"3306"mysql服务端口
mysql_passwordstring"xxxxxxx"mysql ones 用户密码
is_use_independence_mysqlbooleantrue是否使用外置数据库
is_use_independence_mysql8booleantrue是否使用外置数据库 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_passwordmysql_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

开始外置迁移

  1. 登陆 ONES 服务器,进入当前运行中实例的安装目录
cd /data/ones/pkg/ones-example-3.14.xxxxx
  1. 执行 common.sh 脚本,交互页面选择 30 选项

执行后此时会有一个交互的过程,要求输入 mysqlhostmysqlport此时先不要输入!!
进入 screen 终端,如果提示 screen 不存在,yum install screen -y 安装 screen
该脚本会将当前运行实例的数据库导出为 db.tar

sudo screen -S ones
sudo bash common.sh
  1. 新开一个终端,进入安装目录

手动将外置 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
  1. 连接外置数据库
mysql -uones -h<mysql_host> -P<mysql_port> -p<mysql_password>
  1. 导入数据

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;
  • 数据导入完成后,回到第二步的输入 mysqlhostmysqlport,输入完成后即可等待执行,过程有其他中断报错可以及时联系 ONES 的工程师

检查

在完成外置数据库迁移后,还需要进行检查和数据测试

  1. 在最新的安装包目录下,执行 ./onesconfigure ss 查询看是否还存在 mysql 进程,如果没有则正常
./onesconfigure ss
  1. 在页面创建一个新的项目和任务,以英文命名,然后在数据库执行 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