一、安装瀚高数据库
1、下载并上传hgdb4.5.7-see-centos7-x86-64-20210804.rpm到测试服器。
2、开始安装highgo数据库,默认会安装到/opt目录下,安装过程大约在3分钟左右。
执行:
rpm -ivh hgdb4.5.7-see-centos7-x86-64-20210804.rpm
安装完成结果:
opt目录下生成的数据库目录:
3、配置环境变量
查看环境变量配置:
cat /opt/HighGo4.5.7-see/etc/highgodb.env
内容如下:
export HG_BASE=/opt/HighGo4.5.7-see
export HGDB_HOME=/opt/HighGo4.5.7-see
export PGPORT=5866
export PGDATABASE=highgo
export PGDATA=$HGDB_HOME/data
export PATH=$HGDB_HOME/bin:$PATH
配置CentOS环境变量
vim /etc/profile
把上面的内容添加到环境变量,并保存
环境变量生效
source /etc/profile
4、初始化数据库
创建数据库文件夹
mkdir /opt/opt/HighGo4.5.7-see/data
初始化数据库,执行命令:
initdb
设置登录sysdba,syssao(需要输入两次)密码:
5、修改配置文件
修改postgresql.conf文件:
vim /opt/HighGo4.5.7-see/data/postgresql.conf
设置为外部可以访问,关闭证书配置(证书在etc目录下,但启动的时候会报未找到server.crt,把SSL关闭后启动正常)。
listen_addresses = '*'
ssl = off
如图:
修改pg_hba.conf文件:
vim /opt/opt/HighGo4.5.7-see/data/pg_hba.conf
将IPv4的ADDRESS修改为0.0.0.0/0:
6、启用数据库服务
systemctl enable hgdb-see-4.5.7.service & systemctl restart hgdb-see-4.5.7.service
7、下载客户端连接数据库
sysdba登录数据库,执行:
ALTER system set compatible_db = 'oracle';--这是打开
select pg_reload_conf(); --这个是加载
show compatible_db --这个是查看
提供一下数据库的卸载方法:
查看安装的数据库版本:rpm -qa | grep hgdb
卸载highgo数据库:rpm -e hgdb-see-4.5.7-1.el7.centos.x86_64
8、改密码有效期并更改syssso 用户密码 注意:密码默认7天有效最大365天
通过 syssso 用户更改安全参数‘hg_idcheck.pwdvaliduntil’的值,
修改区间为:0—365,数值 0 代表 infinity(密码永不过期),也可自行设置密码修改天数(1—365 天)
psql highgo syssso --使用syssso登录 select set_secure_param('hg_idcheck.pwdvaliduntil','0'); --修改密码有效期 alter user syssso with password 'Hello@123'; --更改一次密码,新密码的有效期即为修改的有效期
9、更改syssao 用户密码并关闭审计
安全审计功能对用户的操作进程审计,并把审计日志生成在$PGDATA/hgaudit下,审计功能默认是开启的。可在后期部署删除脚本用于清理审计日志。因目前删除脚本暂无,如需部署可使用syssao用户登录数据库并执行以下语句,修改完成后,重启生效。
psql -U syssao -d highgo -- 使用syssao登录 select set_audit_param('hg_audit','off'); --关闭审计 alter user syssao with password 'Hello@123';----更改一次密码,新密码的有效期即为修改的有效期
10、更改sysdba 用户密码
\c - sysdba --切换到sysdba用户 alter user sysdba with password 'Hello@123';--更改一次密码,新密码的有效期即为修改的有效期
11、数据库重启
[highgo@hgdb archive]$ pg_ctl -m fast stop [highgo@hgdb archive]$ pg_ctl start
12、修改自启动默认
安全版的自启动默认是集群的,也有单机的,这个需要根据实际进行启动
4.5.6的版本
在$HGDB_HOME/etc下存在两个脚本文件 hgdb-see-4.5.6.single和 hgdb-see-4.5.6.cluster 分别对应配置单机和集群服务,还有一个软连接文件 hgdb-see- 4.5.6,默认连接到集群脚本文件。
单机环境中,使用如下步骤配置数据库服务:
[root@hgdb opt]# cd HighGo4.5.6-see/etc
#备份启动脚本
[root@hgdb ~]cp hgdb-see-4.5.6.single hgdb-see-4.5.6.single.bak [root@hgdb ~]cp hgdb-see-4.5.6.cluster hgdb-see-4.5.6.cluster.bak
#将软连接连接到单机脚本文件即可
[root@node etc] ln -sf hgdb-see-4.5.6.single hgdb-see-4.5.6
4.5.7的版本
将之前版本etc目录下的hgdb-see-4.5.x.single和hgdb-see-4.5.x.cluster合并为 hgdb-see-4.5.x。由etc目录下的隐藏文件 .cluster.mark控制使用集群的服务脚本启动数据库。
数据库安装完毕并初始化后,执行 systemctl start hgdb-see-4.5.7.service默认启动集群服务,如需启动单机服务,需手动将 .cluster.mark重命名:
cd /opt/HighGo4.5.7-see/etc mv .cluster.mark .cluster.mark.bak
13、卸载
1.RPM 包卸载
步骤1:终止数据库服务
systemctl stop hgdb-see-4.5.7.service
步骤 2:如果数据还需使用请做好备份。否则跳过。
cp /opt/HighGo4.5.7-see/data /databak 注意:/databak 请替换为实际备份目录
步骤 3:查询包名
rpm -qa | grep 4.5.7 hgdb-see-4.5.7-1.el7.x86_64
步骤 4:执行卸载
rpm -e --nodeps hgdb-see-4.5.7-1.el7.x86_64
步骤 5:清理数据库所有文件(谨慎操作,建议使用绝对路径,而不是环境变量)
rm -rf /opt/HighGo4.5.7-see/* rm -rf /usr/lib/systemd/system/hgdb*
2.DEB 包卸载
步骤 1:检查包名
dpkg --list | grep 4.5.7 pi hgdb-see-4.5.7 4.5.7 amd64 HighGo Database V4 Release4.5.7 - 64-bit Production hgdb-see-4.5.7
步骤 2:
卸载软件移除软件包:
root@highgo-PC:~# dpkg -r hgdb-see-4.5.7
移除软件包及其配置文件(慎重使用):
root@highgo-PC:~# dpkg -P hgdb-see-4.5.7
注意:在检查数据库状态时,grep 后的信息以实际安装包的信息为准,通常为hgdb/HighGo/版本号等。
14、sm3 访问失败的解决方案
pgsql 和 pdo_pgsql 通过引用 libpq.so.xx 文件访问瀚高数据库,瀚高数据
库安装之后,初始化的 data 目录下的 pg_hba.conf 文件中如果是 sm3,则需要
把 libpq.so.xx 文件替换成瀚高数据库安装目录的 lib 下的 libpq.so.xx,这样
才能访问成功。
没有使用瀚高库的 libpq.so.xx 文件的错误:
使用之后的效果:
详细方案如下:
1. root 用户下,使用 find 命令查找 pgsql.so、pdo_pgsql.so 文件的目录
find / -name *pgsql.so*
2. 使用 ldd 命令查看这两个文件引用的 libpq.so 文件是哪一个
ldd /……/xxx.so瀚高基础软件股份有限公司 https://support.highgo.com
经查看,引用的是 libpq.so.5
3. 使用下面命令查看哪些目录中含有 libpq.so.5
find / -name *libpq.so.5*
经查看,有四个目录包含
4. 用瀚高库的 lib 目录下的 libpq.so.5 文件替换
首先尝试替换 php 安装目录下的 libpq.so.5 文件,替换之后,重启服务
(apache 或者 nginx 或者其他服务),然后测试一下 php 程序,确认是否连接成功。
php 安装目录下如果没有 libpq.so.5 文件,可以尝试替换 pdo_pgsql.so 和
pgsql.so 文件中所引用的目录下的 libpq.so.5 文件(例如:/usr/lib64 目录),
重启服务(apache 或者 nginx 或者其他服务),然后测试一下 php 程序,确认是否连
接成功。
例如:
①把原有的 libpq.so.5 文件重命名一下
mv /usr/local/phpstudy/soft/php/php-7.4.0/sbin/depends/libpq.so.5 /usr/local/phpstudy/soft/php/php-
7.4.0/sbin/depends/libpq.so.5.systembak
②复制数据库目录下的 libpq.so.5 文件到上面目录
php 程序和瀚高库在同一台服务器上时,采用 cp 的方式
cp /opt/HighGo4.5.6-see/lib/libpq.so.5 /usr/local/phpstudy/soft/php/php-7.4.0/sbin/depends/
php 程序和瀚高库不在同一台服务器上时,采用 scp 的方式瀚高基础软件股份有限公司 https://support.highgo.com
scp
root@192.168.112.198:/opt/HighGo4.5.6-see/lib/libpq.so.5 /usr/local/phpstudy/soft/php/php-
7.4.0/sbin/depends/
③重启 php 程序的服务
④执行 php 程序,确认是否连接成功
4.ssl 开启后访问失败的解决方案
瀚高安全版 v4.5 安装后,默认开启 ssl,可以通过 show ssl;查看是否开启。
问题:ssl 开启后,php 程序访问瀚高库时,会提示“无法访问 SSL 联接”的错
误(通过开启瀚高的日志捕获),导致连接瀚高库失败,程序的页面一片空白。
操作系统:UOS20
原因:
PHP 通过 libpq 访问瀚高库,libpq 的数据库连接信息中有 sslmode 参数,
在没有配置该参数时,默认 prefer(首先尝试 SSL 连接,如果失败再尝试非 SSL
连接)。尝试 SSL 连接时,因为客户端没有证书,导致失败。
例如:下面连接信息中没有配置 sslmode,默认是 prefer
$dsn = "pgsql:host=192.168.112.198;port=5866;dbname=highgo";
$db = new PDO($dsn, 'sysdba', 'Hello@123');
方案:没有特殊要求的,建议第二种方案
第一种:
与客户沟通确认,如果客户不需要 ssl 连接,可以把瀚高库的 ssl 关闭
1) sysdba 登录数据库
2) alter system set ssl=off;
3) select pg_reload_conf();
第二种:
如果客户担心关闭 ssl 会影响等保测评或者其他测评,坚持开启 ssl,则数据库
的 ssl 不关闭。
在连接信息中添加 sslmode 参数,设置为 allow 即可。
例如:
$dsn = "pgsql:host=localhost;port=5866;dbname=highgo;sslmode=allow";
$db = new PDO($dsn, 'sysdba', 'Hello@123');
注意:
1、瀚高链接工把记住密码和是安全版全部勾选
2、是基于postgresql的,标准的SQL语句完全支持
3、初始化了的话,会有默认的数据库 highgo
4、新建数据库和数据库模式需要一致:例如数据库名:saibaodb 模式名:saibaodb
5、修改postgresql.conf(数据库目录下的data)文件,添加模式
myphpdb(模式名以实际为准)
二、修改tp6配置
1、安装pdo_pgsql扩展
找到php自带的ext目录里的pgsql库
第二步: 切换目录到pgsql
第三步: 找到phpize whereis phpize
第四步: 如下代码:
# /usr/bin/phpize
# ./configure --with-php-config=/usr/bin/php-config #找到php-config位置
# make && make install
如果一起正常,会发现/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/这里会多两个pdo_pgsql.so 和 pgsql.so
./configure --with-php-config=/www/server/php/73/bin/php-config
Apache:php配置文件中,把pgsql相关的前边的;去掉, | 重启Apache | phpinfo(); 这时候发现扩展出来了
Nginx:php配置文件中,添加extengsions="pgsql.so", | 重启Nginx | phpinfo(); 这时候发现扩展出来了
2、修改根目录.env
APP_DEBUG = true
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = pgsql
HOSTNAME = 127.0.0.1
DATABASE = saibaodb
USERNAME = sysdba
PASSWORD = Hello@123
HOSTPORT = 5866
CHARSET = UTF8
DEBUG = false
PREFIX = b_
[LANG]
default_lang = zh-cn
2、通过瀚高数据库链接工具增加自定义table_msg函数
找到\vendor\topthink\think-orm\src\db\connector\pgsql.sql
执行;
第一步:
CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS
$BODY$
DECLARE
v_type varchar;
BEGIN
IF a_type='int8' THEN
v_type:='bigint';
ELSIF a_type='int4' THEN
v_type:='integer';
ELSIF a_type='int2' THEN
v_type:='smallint';
ELSIF a_type='bpchar' THEN
v_type:='char';
ELSE
v_type:=a_type;
END IF;
RETURN v_type;
END;
$BODY$
LANGUAGE PLPGSQL;
第二步:
CREATE TYPE "public"."tablestruct" AS (
"fields_key_name" varchar(100),
"fields_name" VARCHAR(200),
"fields_type" VARCHAR(20),
"fields_length" BIGINT,
"fields_not_null" VARCHAR(10),
"fields_default" VARCHAR(500),
"fields_comment" VARCHAR(1000)
);
第三步:
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$BODY$
DECLARE
v_ret tablestruct;
v_oid oid;
v_sql varchar;
v_rec RECORD;
v_key varchar;
BEGIN
SELECT
pg_class.oid INTO v_oid
FROM
pg_class
INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name)
WHERE
pg_class.relname=a_table_name;
IF NOT FOUND THEN
RETURN;
END IF;
v_sql='
SELECT
pg_attribute.attname AS fields_name,
pg_attribute.attnum AS fields_index,
pgsql_type(pg_type.typname::varchar) AS fields_type,
pg_attribute.atttypmod-4 as fields_length,
CASE WHEN pg_attribute.attnotnull THEN ''not null''
ELSE ''''
END AS fields_not_null,
'''' AS fields_default,
pg_description.description AS fields_comment
FROM
pg_attribute
INNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oid
INNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oid
LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum
LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum
WHERE
pg_attribute.attnum > 0
AND attisdropped <> ''t''
AND pg_class.oid = ' || v_oid || '
ORDER BY pg_attribute.attnum' ;
FOR v_rec IN EXECUTE v_sql LOOP
v_ret.fields_name=v_rec.fields_name;
v_ret.fields_type=v_rec.fields_type;
IF v_rec.fields_length > 0 THEN
v_ret.fields_length:=v_rec.fields_length;
ELSE
v_ret.fields_length:=NULL;
END IF;
v_ret.fields_not_null=v_rec.fields_not_null;
v_ret.fields_default=v_rec.fields_default;
v_ret.fields_comment=v_rec.fields_comment;
SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name;
IF FOUND THEN
v_ret.fields_key_name=v_key;
ELSE
v_ret.fields_key_name='';
END IF;
RETURN NEXT v_ret;
END LOOP;
RETURN ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
第四步:
COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar)
IS '获得表信息';
---重载一个函数
第五步:
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$BODY$
DECLARE
v_ret tablestruct;
BEGIN
FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP
RETURN NEXT v_ret;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
第六步:
COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar)
IS '获得表信息';
执行完毕后重启下apache和瀚高数据库
瀚高数据库重启命令:pg_ctl start #启动
pg_ctl stop #停止
修改tp6数据库配置文件datebase.php
// 是否严格检查字段是否存在
'fields_strict' => false,
将vendor/topthink/think-orm/src/db/connector/pgsql.sql中的
pg_attrdef.adsrc AS fields_default,
改为
'''' AS fields_default,
原因为PG12中这个表已没有该字段
注意,这里是4个单引号’,而不是两个双引号
上面这一步操作最好删除public或者修改数据库里边的public重命名。不然会导致程序添加修改操作无效。
pgsql没有主键自动递增,需要自己做记录或者自己写函数
表已经建好后设置字段自增:
CREATE SEQUENCE user_id_seq START WITH 1
INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
alter table user alter column id set default nextval('user_id_seq');
建表时设置自增:
CREATE TABLE user
(
id SERIAL primary key
)
问题:SQLSTATE[42804]: Datatype mismatch: 7 错误: 字段 "menuid" 的类型为 integer, 但表达式的类型为 text
LINE 1: ...min_role_priv (menuid , parentid , roleid) SELECT $1,$2,$3 U...
^
HINT: 你需要重写或转换表达式
解决方案:批量插入改为单次插入
违反字段约束无法查看字段名解决方案
查询字段别名:
select * from DBA_CONS_COLUMNS
能看到对应的表名及字段名
至此链接瀚高数据库全部流程及常见错误都已处理!!!
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!