Java开发-信创的注意事项(PolarDB)

前言

信创,全称“信息技术应用创新”,是近年来我国科技领域的一个热词,它不仅仅是一个技术概念,更是一个国家战略。信创的核心在于通过自主研发,实现信息技术领域的自主可控,从而保障国家的信息安全,推动经济的持续稳定增长,并提升国家的核心竞争力。

信创的内涵主要包括两个层面:一是对基础软硬件的自主研发和创新,如国产芯片、操作系统、数据库、中间件等;二是对信息技术应用领域的创新,如云计算、大数据、人工智能、物联网等。这两个层面相互依存,共同构成了信创的完整体系。

常见的信创环境是麒麟操作系统,使用的ARM架构

麒麟990是Arm架构的,Windows10 Arm版本目前为止只有高通的驱动,所以麒麟990的ARM笔记本是无法安装Arm版Windows的。

目前官方支持Windows on Arm的Soc有骁龙835、骁龙850、骁龙8cx、骁龙8cx Gen2、骁龙8cx Gen3、骁龙8c、骁龙7c、骁龙7c Gen2、骁龙7c+ Gen3、Microsoft SQ1、Microsoft SQ2;

华为擎云L410 如果需要安装Windows,可以通过Qemu安装X86/X64架构的Windows,但性能会因为架构转译可能有很大的损耗。

查看服务器架构

1
uname -m
  • 如果输出是 x86_64,则表示服务器是 x86 架构。
  • 如果输出是 aarch64,则表示服务器是 ARM 架构(ARM 64位)。
  • 如果输出是 armv7l,则表示服务器是 ARM 架构(ARM 32位)。

毕昇JDK

毕昇JDK是华为内部基于OpenJDK定制的Huawei JDK的开源版本。

Huawei JDK运行在华为内部500多个产品上,研发团队积累了丰富的开发经验,解决了业务实际运行中遇到的多个疑难问题。

毕昇JDK作为OpenJDK的下游,是一款高性能、可用于生产环境的OpenJDK发行版。毕昇JDK对华为内部应用场景中遇到的一些性能问题和稳定性问题进行了修复,并在ARM架构上进行了性能优化和稳定性增强,在ARM架构上更稳定,在大数据等场景下可以获得更好的性能。

毕昇JDK致力于为JAVA开发者提供一款稳定可靠、高性能、易调测的JDK,也为用户在ARM架构上提供一个更好的选择。

https://www.openeuler.org/zh/other/projects/bishengjdk/

X86

下载

x86

1
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u412-linux-x64.tar.gz

解压

1
2
3
4
sudo mkdir /usr/local/jdk/
sudo mv bisheng-jdk-8u412-linux-x64.tar.gz /usr/local/jdk/
cd /usr/local/jdk
sudo tar zxvf bisheng-jdk-8u412-linux-x64.tar.gz

打开文件

1
sudo vi /etc/profile

添加

1
2
3
4
export JAVA_HOME=/usr/local/jdk/bisheng-jdk1.8.0_412
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

生效

1
sudo source /etc/profile

测试

1
java -version

ARM

下载

arm

1
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u422-linux-aarch64.tar.gz

解压

1
2
3
4
sudo mkdir /usr/local/jdk/
sudo mv bisheng-jdk-8u422-linux-aarch64.tar.gz /usr/local/jdk/
cd /usr/local/jdk
sudo tar zxvf bisheng-jdk-8u422-linux-aarch64.tar.gz

打开文件

1
sudo vi /etc/profile

添加

1
2
3
4
export JAVA_HOME=/usr/local/jdk/bisheng-jdk1.8.0_422
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

生效

1
source /etc/profile

测试

1
java -version

数据库

PolarDB

https://openpolardb.com/document?type=PolarDB-X

集中式部署

这里只是为了体验,采用集中式部署

安装

下载地址

https://github.com/polardb/polardbx-engine/releases/

安装

1
yum install -y t-polardbx-engine-2.4.0-a6d7022.el7.x86_64.rpm

安装后的二进制文件,会出现在 /opt/polardbx_engine/bin 中,推荐确认一下该目录已经包含 mysqld 文件。

1
cd /opt/polardbx_engine/bin

如果要卸载执行

1
yum remove t-polardbx-engine.x86_64

启动

创建 polarx 用户(您也可以使用其他非 root 用户),准备一份 my.cnf(参考模板)和数据目录(如果改了 my.cnf,则下面的目录也要相应修改),就可以准备启动了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建并切换到 polarx 用户
useradd -ms /bin/bash polarx
echo "polarx:polarx" | chpasswd
echo "polarx ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
su - polarx
# 创建必要目录
mkdir polardbx-engine
cd polardbx-engine && mkdir log mysql run data tmp

# 准备一份 my.cnf 文件,可以参考本文末尾的模板,放置于当前目录
vi my.cnf

# 初始化,如果 my.cnf 不在当前目录,请将下述命令的 my.cnf 改成绝对路径
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf --initialize-insecure
# 启动
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf &

稍等片刻,即可登录数据库。

查看是否启动

1
lsof -i:4886

在 Leader 节点上执行下面的命令,可以看到整个集群的状态。

我们用的集中式部署,可以看到集群只有1台,并且它是Leader

1
SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL;

配置文件

编辑配置文件

1
vi /home/polarx/polardbx-engine/my.cnf

my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[mysqld]
basedir = /opt/polardbx_engine
log_error_verbosity = 2
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-binlog
binlog_format = row
binlog_row_image = FULL
master_info_repository = TABLE
relay_log_info_repository = TABLE

# change me if needed
datadir = /home/polarx/polardbx-engine/data
tmpdir = /home/polarx/polardbx-engine/tmp
socket = /home/polarx/polardbx-engine/tmp.mysql.sock
log_error = /home/polarx/polardbx-engine/log/alert.log
port = 4886
cluster_id = 1234
cluster_info = 127.0.0.1:14886@1
server_id = 2712347953

# base config
character-set-server=utf8mb4
max_connections = 1000
max_allowed_packet = 256M
lower_case_table_names=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_authentication_plugin=mysql_native_password

# slow_query
slow_query_log = ON
slow-query-log-file = /home/polarx/polardbx-engine/log/polardbx-slow.log
long_query_time = 2

# performance optimization
innodb_flush_log_at_trx_commit=2
sort_buffer_size = 4M
thread_cache_size = 128
innodb_buffer_pool_size = 5000M
group_concat_max_len = 102400

[mysqld_safe]
pid_file = /home/polarx/polardbx-engine/run/mysql.pid

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

新增配置

创建日志目录

1
mkdir /home/polarx/polardbx-engine/log

添加的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[mysqld]
# base config
character-set-server=utf8mb4
max_connections = 1000
max_allowed_packet = 256M
lower_case_table_names=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
default_authentication_plugin=mysql_native_password

# slow_query
slow_query_log = ON
slow-query-log-file = /home/polarx/polardbx-engine/log/polardbx-slow.log
long_query_time = 2

# performance optimization
innodb_flush_log_at_trx_commit=2
sort_buffer_size = 4M
thread_cache_size = 128
innodb_buffer_pool_size = 5000M
group_concat_max_len = 102400

[client]
default-character-set=utf8mb4

其中

基本配置

  • max_connections=1000:设置 MySQL 允许的最大连接数为 1000。这意味着最多可以同时有 1000 个客户端连接到 MySQL 服务器。
  • max_allowed_packet=256M:设置 MySQL 服务器允许的最大数据包大小为 256MB。这一配置决定了单个 SQL 语句、数据行或结果集允许的最大字节数。
  • lower_case_table_names=1:表名不区分大小写。
  • sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES:放宽了SQL限制,在SQL报错时配置。
  • default_authentication_plugin=mysql_native_password:使用旧版本默认的身份验证机制,兼容性更好。

字符集配置

1
2
3
4
5
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4

性能优化配置

1
2
3
4
5
innodb_flush_log_at_trx_commit=2
sort_buffer_size = 4M
thread_cache_size = 128
innodb_buffer_pool_size = 5000M
group_concat_max_len = 102400

作用

  1. innodb_flush_log_at_trx_commit=2
  • 作用:此设置控制事务日志的刷新策略。值为 2 表示每次事务提交时,日志只会写到日志文件,而不会立即刷新到磁盘。这提高了性能,但在崩溃情况下可能会丢失最近的部分事务。
  • 用途:适合性能要求较高的场景,但要注意可能的数据丢失风险。
  1. sort_buffer_size=4M
  • 作用:这个参数指定每个线程用于排序操作的缓冲区大小,默认设置为 4MB。在执行 ORDER BYGROUP BY 查询时,MySQL 会使用这个缓冲区。
  • 用途:增大该值可以提高大型数据集的排序效率,特别是在频繁进行排序操作时。需要根据实际需求和系统内存来调整该值。
  1. thread_cache_size=128
  • 作用:控制 MySQL 为新连接缓存的线程数量。该设置表明最多可以缓存 128 条线程。如果当前活跃线程少于这个数量,MySQL 将重用这些线程,而不是每次都创建新线程。
  • 用途:提高连接处理的效率,减少频繁创建和销毁线程的开销,适合高并发的应用场景。
  1. innodb_buffer_pool_size=5000M
  • 作用:指定 InnoDB 存储引擎用于缓冲数据和索引的内存池大小,总共 5000MB(5GB)。这是提升 InnoDB 表性能的关键参数。
  • 用途:一个较大的缓冲池可以显著提高读写性能,能够缓存更多的数据和索引,从而减少磁盘 I/O。recommended to set this value to approximately 70-80% of your available memory if the server is dedicated to MySQL.
  1. group_concat_max_len=102400
  • 作用:该参数定义了 GROUP_CONCAT 函数返回的最大长度,设置为 102400 字节。如果结果超过该值,将会被截断。
  • 用途:适合需要处理大数据量结果的查询,增加这个值可以避免在拼接字符串时信息丢失。

表名不区分大小写

1
SHOW VARIABLES LIKE 'lower_case_table_names';

  • 0: 表名是区分大小写的。在 Linux 系统上,默认使用此设置。
  • 1: 表名不区分大小写。通常在 Windows 系统上使用。
  • 2: 表名是区分大小写的,但在网站服务器上访问时隐式转换为小写。

配置文件中添加

1
lower_case_table_names=1

sql-mode

Expression #3 of ORDER BY clause is not in SELECT list, references column ‘ireciting_base.m.create_time’ which is not in SELECT list; this is incompatible with DISTINCT

原因

DISTINCT去重关键字版本不兼容(字面意思), 其实修改以下配置文件,去掉sqlmode中的ONLY_FULL_GROUP_BY模式即可

解决办法

mysql配置文件添加如下代码

1
2
[mysqld]
sql-mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

sql_mode 变量用于控制数据库的行为,尤其是在数据验证和执行 SQL 语句时。你提到的 sql_mode 包含多个选项,它们的具体作用如下:

  1. STRICT_TRANS_TABLES
  • 作用:在事务表(例如使用 InnoDB 存储引擎的表)中,如果出现不合法的插入,MySQL 将返回错误,而不是默默地将数据插入为 NULL 或默认值。这意味着如果你试图向表中插入无效的数据,MySQL 将停止执行并给出错误提示。
  • 用途:帮助维护数据的完整性,使得应用程序能够更早地捕捉到数据问题。
  1. NO_ZERO_IN_DATE
  • 作用:禁止在日期字段中使用零值。例如,'2024-00-01'(月份为零)将被视为无效,插入将失败。
  • 用途:确保日期数据的有效性,防止不合法的日期插入数据库。
  1. NO_ZERO_DATE
  • 作用:禁止使用‘0000-00-00’作为日期值。如果试图插入或更新为此值,MySQL 会返回错误。
  • 用途:确保插入的日期数据是有效的,防止使用零日期占位符。
  1. ERROR_FOR_DIVISION_BY_ZERO
  • 作用:当发生除以零的操作时,MySQL 将返回错误,而不是将结果返回为 NULL 或其他值。
  • 用途:在执行 SQL 查询计算时,避免由于除以零导致的不准确结果,从而更容易发现潜在的逻辑错误。
  1. NO_ENGINE_SUBSTITUTION
  • 作用:如果指定的存储引擎在创建表时不可用,MySQL 将返回错误,而不是用默认存储引擎(如 InnoDB)替代它。
  • 用途:确保使用的存储引擎是用户期望的,避免意外地使用其他引擎。

重启

以下是通过 mysqld_safe 启动的 PolarDB-X 实例重启的步骤:

  1. 找到正在运行的 MySQL 实例进程

首先,你需要找到 PolarDB-X 服务的进程 ID (PID):

1
ps aux | grep /opt/polardbx_engine/bin/mysqld

这条命令会列出所有与 mysqld 相关的进程。

结束的先后顺序

1
2
/opt/polardbx_engine/bin/mysqld_safe
/opt/polardbx_engine/bin/mysqld
  1. 停止 PolarDB-X 实例

使用 kill 命令停止该进程:

1
sudo kill -TERM <PID>

sudo kill -TERM 命令中,-TERM 实际上是 -15 的别名,用于向进程发送一个终止信号(SIGTERM)。

这是一个请求进程优雅地终止的信号,它允许进程清理资源并进行正常的关闭。

或者,若需要强制终止进程,可以使用:

1
sudo kill -9 <PID>
  1. 确认进程已停止
1
lsof -i:4886
  1. 启动 PolarDB-X 实例

使用原来的启动命令重新启动 PolarDB-X 实例:

1
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf &
  1. 检查服务状态

你可以通过以下命令检查 PolarDB-X 实例是否成功启动:

1
lsof -i:4886

如果启动失败可以查看日志:

1
tail -f /home/polarx/polardbx-engine/log/alert.log

登录

1
mysql -h127.0.0.1 -P4886 -uroot

修改

查看用户

1
SELECT User, Host,authentication_string FROM mysql.user;

添加远程root用户

1
2
3
4
5
6
7
8
CREATE USER 'root'@'%' IDENTIFIED BY 'Xhkjedud07';
ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER;

-- 赋予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

修改密码

1
2
alter user 'root'@'%' identified by "Xhkjedud07_2";
flush privileges;

修改本地root密码

1
2
alter user root@localhost identified by "Xhkjedud07";
flush privileges;

如果想清空本地root的密码

1
2
alter user root@localhost identified by "";
flush privileges;

重装

默认安装后,表名是区分大小写的,这时候修改配置不区分大小写会失败,所以这里只能重装。

首先,你需要找到 PolarDB-X 服务的进程 ID (PID):

1
ps aux | grep mysqld

这条命令会列出所有与 mysqld 相关的进程。记下你认为是 PolarDB-X 实例的 PID。

注意进程的用户是polarx

停止 PolarDB-X 实例

使用 kill 命令停止该进程:

1
sudo kill -TERM <PID>

结束的先后顺序

1
2
/opt/polardbx_engine/bin/mysqld_safe
/opt/polardbx_engine/bin/mysqld

查看是否停止

1
lsof -i:4886

删除之前的数据

1
2
3
4
5
rm -rf /opt/polardbx_engine
rm -rf /home/polarx/polardbx-engine

yum list installed
yum remove -y t-polardbx-engine.x86_64

然后再按上面重新安装即可

TiDB

https://cn.pingcap.com/product-community/

对比

https://blog.csdn.net/Rookie_CEO/article/details/140455042

https://mp.weixin.qq.com/s?__biz=MzA5Mzg2MTMwMA==&mid=2650458644&idx=1&sn=4eaaa4ec09108215213e33b99b2b9962&chksm=89077af22946f9615fda4e11577779d28699142994ef56df9165ad8d0518927d386c0eabba84&scene=27

对比

img

达梦

对Mysql的支持有限

人大金仓/电科金仓

KingbaseES以内核兼容为基础,通过初始化参数控制,兼容MySQL 数据库,在该模式下支持MySQL常用功能,兼容程度达90%以上。

海量 和 瀚高 主要用于需要存储和分析大规模数据集的场景,如日志数据分析、用户行为分析等。