暂无图片
暂无图片
10
暂无图片
暂无图片
暂无图片

案例分析 | 搭建基于GBase8a的博客系统遇到的若干问题

原创 严少安 2022-02-21
29891

20220126413d8586e159460eb477559ba39ab809.jpg

关于 GBase 8a 数据库

GBase 是南大通用数据技术有限公司推出的自主品牌的数据库产品,在国内数据库市场具有较高的品牌知名度。

GBase 8a MPP Cluster(以下简称“8a集群”)是南大通用公司自主研发、国内领先的大规模分布式并行数据库集群系统,具有满足各个数据密集型行业日益增大的数据分析、数据挖掘、数据备份和即席查询等需求的能力。已在人民银行、银监会、农总行、中行、中移动、海关总署等数百家用户形成规模化应用,目前部署节点总数超过25000个,管理数据超过200PB。

关于 WordPress 博客系统

WordPress是使用PHP语言开发的博客平台,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。

环境准备

  1. OS: CentOS Linux release 7.9.2009 (Core)
  2. OS安全:关闭防火墙、iptables、selinux等。
  3. 安装并启动Docker服务
[root@centos7 wp-blog]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2022-02-20 20:12:56 CST; 1h 51min ago

启动 GBase 8a 数据库

本案例中,为便于演示,使用Docker版的 GBase 8a,具体启动命令如下:

# 从 Docker Hub 拉去镜像 docker pull shihd/gbase8a:1.0 # 运行容器,将端口5258映射到宿主机 docker run -dit --name gbase8a -p5258:5258 -v /data/dg/:/data shihd/gbase8a:1.0 # 进入容器内 docker exec -it gbase8a bash # 进入gbase数据库 gbase -uroot -proot

为 wordpress 准备 user/schema:

create database wordpress; create user wp@'%' identified by 'wp'; grant all on wordpress.* to wp@'%'; show grants for wp@'%';

20220220_141325.png

安装 WordPress

使用 Yum 直接安装 wordpress, apache server,命令如下:

# 安装 wordpress 包 yum -y install wordpress httpd # 打印php信息,稍后可通过页面进行查看 echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php # 在 apache server 的路径下,创建 wordpress 目录的链接 ln -s /usr/share/wordpress /var/www/html/wp-blog

到此,基本安装完成,接下来需要配置数据库连接信息:

# 修改数据库连接信息 sed -i 's/database_name_here/wordpress/' /var/www/html/wp-blog/wp-config.php sed -i 's/username_here/wp/' /var/www/html/wp-blog/wp-config.php sed -i 's/password_here/wp/' /var/www/html/wp-blog/wp-config.php sed -i 's/localhost/192.168.8.101:5258/' /var/www/html/wp-blog/wp-config.php ## 修改默认字符校验规则 sed -i 's/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/' /var/www/html/wp-blog/wp-includes/wp-db.php # 检查配置文件是否修改成功 cat /var/www/html/wp-blog/wp-config.php | grep DB

修改完成后,启动httpd服务:

# 启动httpd systemctl start httpd

运行httpd服务后,便可通过URL:http://192.168.8.101/phpinfo.php 查看php信息,如图所示。

20220220_221712.png

通过 URL:http://192.168.8.101/wp-blog/wp-admin/install.php 来进行博客系统的初始化。

20220220_155803.png

到此,个人博客系统搭建完成。

20220220_222059.png

遇到的问题

接下来,着重阐述在搭建博客时遇到的几点问题,以及问题解析。

Case 1: Unknown collation: ‘utf8mb4_unicode_520_ci’

  • 问题解读:
    由于wordpress默认使用MySQL数据库,从MySQL 5.7开始,引入了新的字符校验规则utf8mb4_unicode_520_ci,而这在GBase 8a中是不支持的,所以需要修改wordpress的默认配置项。
/** Database Charset to use in creating database tables. */ define( 'DB_CHARSET', 'utf8mb4' ); /** The Database Collate type. Don't change this if in doubt. */ define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );

如若不修改,则会遇到下面的报错信息:

WordPress database error: [Unknown collation: 'utf8mb4_unicode_520_ci']
CREATE TABLE wp_users ( ID bigint(20) unsigned NOT NULL auto_increment, user_login varchar(60) NOT NULL default '', user_pass varchar(255) NOT NULL default '', user_nicename varchar(50) NOT NULL default '', user_email varchar(100) NOT NULL default '', user_url varchar(100) NOT NULL default '', user_registered datetime NOT NULL default '0000-00-00 00:00:00', user_activation_key varchar(255) NOT NULL default '', user_status int(11) NOT NULL default '0', display_name varchar(250) NOT NULL default '', PRIMARY KEY (ID), KEY user_login_key (user_login), KEY user_nicename (user_nicename), KEY user_email (user_email) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci

20220220_155917.png

Case 2: (GBA-01EX-700) Gbase general error: unsupported key algorithm

  • 问题解读:
    GBase 8a 当前版本,不支持 KEY user_login_key (user_login) 这种语法。
    故会遇到下面的报错信息:
WordPress database error: [(GBA-01EX-700) Gbase general error: unsupported key algorithm]
CREATE TABLE wp_users ( ID bigint(20) unsigned NOT NULL auto_increment, user_login varchar(60) NOT NULL default '', user_pass varchar(255) NOT NULL default '', user_nicename varchar(50) NOT NULL default '', user_email varchar(100) NOT NULL default '', user_url varchar(100) NOT NULL default '', user_registered datetime NOT NULL default '0000-00-00 00:00:00', user_activation_key varchar(255) NOT NULL default '', user_status int(11) NOT NULL default '0', display_name varchar(250) NOT NULL default '', PRIMARY KEY (ID), KEY user_login_key (user_login), KEY user_nicename (user_nicename), KEY user_email (user_email) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

20220220_165617.png

  • 解决办法:

将DDL中的 KEY user_login_key (user_login)... 去掉。

  • 问题引申:

GBase 8a 系统支持三类索引:

  1. 智能索引:
    粗粒度,在DC满块时自动创建智能索引,所有列都有,对用户透明,无需用户手动维护。
  2. Hash索引:
    提升等值查询的性能,需用户根据查询列手动创建,会影响数据入库性能。
  3. 全文检索:
    提升文本内容的查询效率,采用全单字索引方式,并且可以保证100%的查询召回率,
    需要用户手动创建,需特别安装支持全文检索的插件包后才能使用全文检索功能。

Case 3: ERROR 1067 (42000): Invalid default value for ‘user_registered’

  • 问题解读:
    这个报错是由于字段 user_registered 的默认值不合规引起的,应由'0000-00-00 00:00:00'改为'0001-01-01 00:00:00'。这也是GBase 8a与MySQL不同之处之一。

  • 问题引申:
    当我们需要做异构数据库迁移时,需要注意数据类型的兼容性问题。

    数据类型:DATETIME
    最小值:0001-01-01 00:00:00.000000
    最大值:9999-12-31 23:59:59
    显示格式:YYYY-MM-dd HH:MI:SS.ffffff --> 精确到微秒

另外,GBase为我们提供了数据迁移工具-- GBase Migration Toolkit
GBase Migration Toolkit 迁移工具是 GBase 提供的一款可以实现异构数据库进行数据迁移的工具。目前可以实现将源数据库(目前支持的源数据库有:ACCESS、Oracle、SQL Server 2005、DM、DB2、MySQL、ShenTong、GBase 8s V8.3 和 PostgreSQL)中的数据迁移到目标数据库(目前支持的目标数据库有:GBase 8a、GBase 8t 和 GBase 8s V8.7、GBase 8s V8.8)。

  • 引申阅读:

    1. MySQL 8.0 中的DATETIME
      Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type (‘0000-00-00’ or ‘0000-00-00 00:00:00’), if the SQL mode permits this conversion.
    2. Oracle 21c 中没有DATETIME,而是DATE
      DATE: Valid date range from January 1, 4712 BC, to December 31, 9999 AD. The default format is determined explicitly by the NLS_DATE_FORMAT parameter or implicitly by the NLS_TERRITORY parameter.
    3. PostgreSQL 14 中没有DATETIME,而是timestamp
      timestamp: both date and time, Low Value: 4713 BC, High Value: 294276 AD.

Case 4: ERROR 1733 (HY000): (GBA-01EX-700) Gbase general error: Unsupported data type.

  • 问题解读:
    这个报错是由于字段 bigint 指定了unsigned无符号数字所导致的。
    GBase 8a 当前版本,不支持unsigned的无符号数字。

  • 演示示例:

gbase> CREATE TABLE t1 ( ID bigint(20) unsigned); ERROR 1733 (HY000): (GBA-01EX-700) Gbase general error: Unsupported data type. gbase> CREATE TABLE t1 ( ID bigint(20) ); Query OK, 0 rows affected (Elapsed: 00:00:00.02)
  • 解决办法:
    unsigned去掉即可。

Case 5: ERROR 1101 (42000): BLOB/TEXT column ‘meta_value’ can’t have a default value

  • 问题解读:
    该问题是由字段meta_value的默认值导致的,在当前GBase 8a版本中,数据类型longtext不支持指定DEFAULT值。
    DEFAULT NULL去掉即可。
CREATE TABLE `wp_commentmeta` ( ... `meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL
  • 问题引申:
  1. 在实际的项目不建议使用char和text类型,建议使用 VARCHAR 数据类型。
  2. TEXT类型不能指定DEFAULT值,仅兼容使用,推荐使用 VARCHAR 数据类型。

总结

从上述5个Case中,可以将问题归类为:
1)字符集 (Case 1)
2)DDL(表定义、索引定义) (Case 2)
3)数据类型 (Case 3, Case 4, Case 5)

这是日常工作中容易遇到的基础问题,需要在 GBase 8a 日常管理、异构数据库迁移到 GBase 8a 时重点注意的地方。

相关链接


2022-02-20
Yan

最后修改时间:2023-04-12 10:34:22
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论