国产化数据库金仓Linux版部署过程


0.安装包准备

找到你的操作系统对应的平台所支持的软件包下载,我这里下载的是x86(64)的

国产 容器 iSula 兼容 docker吗 国产化docker_linux

得到一个镜像文件: KingbaseES_V008R006C008B0014_Lin64_install.iso

下载license包(专业版90天)

也可以下载开发版,有365天有效期

wget https://kingbase.oss-cn-beijing.aliyuncs.com/KESV8R3/01.%E5%85%A8%E9%87%8F%E5%AE%89%E8%A3%85%E5%8C%85/license_%E4%B8%93%E4%B8%9A%E7%89%88.zip

1.安装语言变量设置

echo $LANG
export LANG=zh_CN.UTF-8

2.准备工作

将ISO文件和Licence上传到系统,同时Licence解压出来

(1).建立好要安装的目录和用户(要求不能安装在root下),这里以testuser用户为例

使用testuser用户执行即可

mkdir /home/testuser/Kingbase/ES/V8 -p

同时将licence文件解压到:/home/testuser/Kingbase/license_29402_0.dat

(2).镜像挂载

需要root用户执行

mkdir /home/testuser/kdb -p
mount KingbaseES_V008R006C008B0014_Lin64_install.iso /home/testuser/kdb

#mount结果
[root@localhost testuser]# mount KingbaseES_V008R006C008B0014_Lin64_install.iso /home/testuser/kdb
mount: /dev/loop0 is write-protected, mounting read-only

上面提示的read-only正常,不用理它

(3).内核配置

需要root用户执行

##手工操作执行方式
vi /etc/sysctl.conf
    
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 4294967295
kernel.shmmni= 4096
kernel.sem= 250 32000 100 128
net.ipv4.ip_local_port_range= 9000 65500
net.core.rmem_default= 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576

sysctl -p
    
##偷懒复制粘贴执行方式
cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 4294967295
kernel.shmmni= 4096
kernel.sem= 250 32000 100 128
net.ipv4.ip_local_port_range= 9000 65500
net.core.rmem_default= 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576
EOF

sysctl -p

(4).修改内存、进程资源限制

需要root用户执行

##手工操作执行方式
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
# unlimited表示无限制
* soft core unlimited
* hard core unlimited

##偷懒复制粘贴执行方式
cat >> /etc/security/limits.conf << EOF
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft core unlimited
* hard core unlimited
EOF

(5).修改/etc/systemd/logind.conf

需要root用户执行

systemd-logind服务中引入的一个特性,是当一个用户退出系统后,会删除所有有关的IPC对象。该特性由/etc/systemd/logind.conf文件中的RemoveIPC参数控制。某些操作系统会默认打开,会造成程序信号丢失等问题(只有redhat7及以上和一些特殊的国产Linux的版本需要修改,改之前可先查看此项是否为默认yes)。设置RemoveIPC=no。 设置后重启服务

sed -i 's/#RemoveIPC=no/RemoveIPC=no/g' /etc/systemd/logind.conf
systemctl daemon-reload
systemctl restart systemd-logind.service

3.进行命令行安装

执行命令行先确认安装目录和Licence已准备好

切换到testuser后执行以下命令进行安装:

echo $LANG
export LANG=zh_CN.UTF-8

cd /home/testuser/kdb
sh setup.sh -i console

之后根据提示选择参数进行安装即可,中间一般选ENTER或YES就可,
有一个license和安装路径需要复制进去:

/home/testuser/Kingbase/license_29402_0.dat
/home/testuser/Kingbase/ES/V8

兼容模式就选PG吧(oracle不熟悉,你也可以选oracle,默认也是这个)
另外默认的用户名是system,可以修改成你喜欢的名称

安装完成后根据提示执行安装目录下的root.sh脚本
安装完成
----

恭喜!KingbaseES V8 已成功地安装到:

/home/testuser/Kingbase/ES/V8

如果您需要将 KingbaseES V8 注册为系统服务,请运行

/home/testuser/Kingbase/ES/V8/install/script/root.sh

安装完成,切换到root用户执行root.sh脚本

su root
/home/testuser/Kingbase/ES/V8/install/script/root.sh


#日志:
[root@localhost kdb]# /home/testuser/Kingbase/ES/V8/install/script/root.sh
Starting KingbaseES V8: 
waiting for server to start.... done
server started
KingbaseES V8 started successfully

4.启动停止

使用普通用户进行服务的启动与停止

#切换用户
su testuser

#需要先修改环境变量,否则报sys_ctl找不到、
vi /etc/profile
export KDB_HOME=/home/testuser/Kingbase/ES/V8/Server/
export PATH=$KDB_HOME/bin:$PATH

#启动服务
sys_ctl -w start -D ${Data文件目录} -l "${Data文件目录}/sys_log/startup.log"

sys_ctl -w start -D /home/testuser/Kingbase/ES/V8/data -l /home/testuser/Kingbase/ES/V8/data/sys_log/startup.log

#停止服务
sys_ctl stop -m fast -w -D ${Data文件目录}

sys_ctl stop -m fast -w -D /home/testuser/Kingbase/ES/V8/data
    
#防火墙管理
firewall-cmd --zone=public --add-port=54321/tcp --permanent
firewall-cmd --reload

国产化数据库(金仓)docker版部署过程

一.下载镜像

下载地址:https://www.kingbase.com.cn/xzzx/index.htm

去官网找到镜像文件,点击下载即可(点下载需要输验证码和手机号)

国产 容器 iSula 兼容 docker吗 国产化docker_数据库_02

二.docker方式安装金仓数据库

参考文档:https://help.kingbase.com.cn/v8/install-updata/install-docker/index.html

1.安装docker

安装docker过程略,自行搜索网上文档

2.导入镜像

使用root用户导入镜像,将tar包到本机docker镜像仓库中

#导入
docker load -i kdb_x86_64_v008r006c008b0014.tar

#查看导入
[root@localhost testuser]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
kingbase     v1        084693efda57   2 months ago   718MB

3.运行镜像

##命令如:
docker run -idt --privileged -p ${hostport}:${containerport} –v ${hostpath}:${containerpath} --name ${sub_container} ${image} /usr/sbin/init

##具体示例,指定用户名为webuser,密码为123456,以mysql模式启动(实际上还是pg语法)
##如果你想使用oracle模式启动,修改DB_MODE=oracle即可
docker run -idt --privileged -p 4321:54321 -e DB_MODE=mysql -e DB_USER=webuser -e DB_PASSWORD=123456 -v /home/kingbase/userdata:/home/kingbase/userdata --name kingbase kingbase:v1 /bin/bash

查看结果

[root@localhost testuser]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                         NAMES
aad5a26b8fcb   kingbase:v1   "/bin/bash /home/kin…"   4 seconds ago   Up 3 seconds   0.0.0.0:4321->54321/tcp, :::4321->54321/tcp   kingbase

进入容器

docker exec -it 8af99fb48f3b /bin/bash

测试是否可成功访问对应数据库

#进入容器
docker exec -it aad5a26b8fcb /bin/bash

#
cd /home/kingbase/install/kingbase/bin
./ksql -h 127.0.0.1 -d test -U webuser -p 54321
    
#查看兼容模式
cat /home/kingbase/userdata/data/initdb.conf |grep mode

金仓数据库简单操作使用

1.命令行进入数据库

cd /home/testuser/Kingbase/ES/V8/ClientTools/bin
./ksql -h 127.0.0.1 -d test -U webuser -p 54321

其中 -d后面的是数据库名,-U后面的为用户名,-p 指定端口号
输入密码进入
[testuser@localhost bin]$ ./ksql -h 127.0.0.1 -d test -U webuser -p 54321
Password for user webuser: 
Type "help" for help.

test=# \l
                                List of databases
   Name    |  Owner  | Encoding |   Collate   |    Ctype    |  Access privileges  
-----------+---------+----------+-------------+-------------+---------------------
 kingbase  | webuser | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 security  | webuser | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 template0 | webuser | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/webuser         +
           |         |          |             |             | webuser=CTc/webuser
 template1 | webuser | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/webuser         +
           |         |          |             |             | webuser=CTc/webuser
 test      | webuser | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
(5 rows)

test=#

2.创建数据库

create database liutest;

3.数据库和表等DDL相关

#查看数据库
\l
SELECT * FROM information_schema.db
SELECT datname FROM pg_database;

#查看表
\d
\d+
SELECT table_name FROM information_schema.tables where table_catalog = 'liutest' and table_schema = 'liuschematest';
    
#查看表字段
SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = 't_test';

#切换数据库
\c liutest

#修改表描述
COMMENT ON TABLE your_table_name IS 'Your new table description';

#查看所有函数,可以修改public为你自己的schema
SELECT proname, proargtypes, prosrc FROM pg_proc WHERE pronamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public');

#查看函数,表、序列,索引命令
\df
\dt
\ds
\di

#查看所有的触发器
SELECT * FROM pg_trigger;

#删除触发器
DROP TRIGGER trigger_name ON table_name;

#查看触发器关联的表名
SELECT tgname, tgrelid::regclass AS table_name  
FROM pg_trigger;

#查看postgresql参数

##使用show命令
例如,要查看max_connections参数的值,您可以执行以下命令
SHOW max_connections;

##使用pg_settings视图
查看所有参数的设置:
SELECT name, setting, unit, short_desc, context FROM pg_settings;
查看特定参数的设置:
SELECT name, setting, unit, context, short_desc FROM pg_settings WHERE name = 'max_connections';

##使用current_setting()函数
使用current_setting()函数来获取特定参数的当前值
SELECT current_setting('max_connections');

#命令行设置postgresql参数,如修改 max_connections 参数
ALTER SYSTEM SET max_connections = 200;

#查看所有的序列
SELECT sequence_name FROM information_schema.sequences WHERE sequence_catalog = 'dbName' and sequence_schema = 'public' ;
或者也能看到
\d+

#删除所有的序列
SELECT 'DROP SEQUENCE ' || sequence_name || ';' FROM information_schema.sequences WHERE sequence_catalog = 'liutest' and sequence_schema = 'liuschematest' ;

#postgresql修改序列的起始值
ALTER SEQUENCE your_sequence_name RESTART WITH new_start_value;
请注意,修改序列的起始值不会影响已经使用该序列生成的值。它只会影响从新起始值开始生成的值。
#查看 PostgreSQL 中序列的当前值,可以使用以下查询
SELECT last_value FROM your_sequence_name;
#获取序列的下一个值
SELECT nextval('your_sequence_name');

4.模式管理

#模式查看
\dn+

#创建一个名为liuschematest的模式
create schema liuschematest;

#修改归属(默认是归属在登录的用户下)
ALTER SCHEMA liuschematest OWNER TO webuser;

#查看当前的模式
SELECT current_schema(); 

#切换模式到liuschematest
set search_path to liuschematest;

#修改schema的名称
alter schema liuschematest rename to renametest;

#设置默认模式,不设置默认连接上是public,按需使用
ALTER ROLE webuser SET search_path="liuschematest";

5.建表测试

#简单建表
create table liutest.test(
   id bigint ,
   name varchar(50),
   age int,
   password varchar(30)
 );
 
#使用IDENTITY自增方式建表测试
CREATE TABLE t_user (
    user_id integer GENERATED ALWAYS AS IDENTITY PRIMARY KEY ,
    user_name varchar(50) NOT NULL UNIQUE
)
;

#插入数据
INSERT INTO t_user (user_name) values ('tttt');

6.增删改查

insert into test values(1,'test',21,'123');
update test set name = 'testchanged';
select * from test;
delete from test where name = 'testchanged';

#删除表
drop table test;
DROP TABLE your_table CASCADE;

#截断表
truncate table test;

7.备份与恢复

#导出全部数据和表结构(会导出所有的模式,一般不使用)
sys_dump -h localhost -U webuser -p 54321 -W -d liutest -f /home/testuser/all.sql

#导出全部数据和表结构,指定只导出库和模式下的(推荐使用这种)
sys_dump -h localhost -U webuser -p 54321 -W -d liutest -n liuschematest -f /home/testuser/liuschematest.sql

#导出表结构(-s说明只导出结构)
sys_dump -h localhost -U webuser -p 54321 -W -d liutest -n liuschematest -s -f /home/testuser/table.sql

#导出数据(-a说明只导数据)
sys_dump -h localhost -U webuser -p 54321 -W -d liutest -n liuschematest -a -f /home/testuser/data.sql

#导出数据和表结构(使用-t指定表名,多张表使用多个-t)
sys_dump -h localhost -U webuser -p 54321 -W -d liutest -n liuschematest -t liuschematest.biz_income_expenditure -t liuschematest.common_message -f /home/testuser/sometables.sql

#参数说明
-W, --password force password prompt (should happen automatically),提示输入密码
-d, --dbname=DBNAME database to dump,指定数据库名
-n, --schema=PATTERN dump the specified schema(s) only,指定模式名
-N, --exclude-schema=PATTERN do NOT dump the specified schema(s),导出时不带模式名
-f, --file=FILENAME output file or directory name
-t, --table=PATTERN dump the specified table(s) only,指定表名,可以使用多个-t来指定多个表名
-T, --exclude-table=PATTERN  do NOT dump the specified table(s),排除表名,指定哪些表不用导出
-a, --data-only dump only the data, not the schema,只导出数据
-s, --schema-only dump only the schema, no data,只导表数据
#更详细的参数可以使用命令帮助
sys_dump --help
    
#还原数据
ksql -h localhost -p 54321 -U webuser -d liutest < /home/testuser/all.sql
#如果直接在数据库命令下
\i /home/testuser/all.sql

8.时间更新(类似mysql的修改时间自动更新)

##先创建函数
CREATE OR REPLACE FUNCTION update_time_fn()  
RETURNS TRIGGER AS 
$$
BEGIN  
    NEW.update_time := current_timestamp;  
    RETURN NEW;  
END;
$$
 LANGUAGE plpgsql;

##再创建触发器
CREATE TRIGGER biz_income_expenditure_update_time_trigger  
BEFORE UPDATE ON biz_income_expenditure  
FOR EACH ROW  
EXECUTE FUNCTION update_time_fn();

9.修改密码

#语法:
ALTER USER your_username WITH PASSWORD 'your_new_password';

#示例:
ALTER USER webuser WITH PASSWORD 'abcd_1234';


10.角色/用户管理

创建新角色/用户

CREATE USER webuser WITH PASSWORD '123456';
CREATE ROLE webuser WITH PASSWORD '123456';

授权登录

ALTER ROLE webuser LOGIN;

赋予角色/用户权限

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO newuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO newuser;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO newuser;
ALTER ROLE newuser CREATEDB;  -- 如果需要允许创建新数据库的话

GRANT 命令来赋予角色/用户权限

数据访问权限:
SELECT: 允许用户查询表中的数据。
INSERT: 允许用户向表中插入新行。
UPDATE: 允许用户修改表中的数据。
DELETE: 允许用户从表中删除行。
TRUNCATE: 允许用户清空表中的所有数据。例如,要允许 newuser 对 mydb 数据库中的所有表进行查询和插入操作,你可以执行以下命令:

GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA public TO newuser;
序列访问权限
USAGE: 允许用户使用序列。例如,要允许 newuser 使用 mydb 数据库中的所有序列,你可以执行以下命令:

GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO newuser;
函数访问权限
EXECUTE: 允许用户调用函数。例如,要允许 newuser 调用 mydb 数据库中的所有函数,你可以执行以下命令:

GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO newuser;
其他权限
SET: 允许用户更改会话级别的配置参数。
LOCK TABLES: 允许用户锁定表。
REFERENCES: 允许用户在表上创建外键约束。
...等等。例如,要允许 newuser 更改会话级别的配置参数,你可以执行以下命令

GRANT SET ON ALL TABLES IN SCHEMA public TO newuser;

11.回收权限

在 PostgreSQL 中,如果你想回收某个角色或用户的权限,你可以使用 REVOKE 命令。以下是一些常用的权限回收示例:

回收数据访问权限

REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM newuser;  
REVOKE INSERT ON ALL TABLES IN SCHEMA public FROM newuser;

回收序列访问权限

REVOKE USAGE ON ALL SEQUENCES IN SCHEMA public FROM newuser;

回收函数访问权限

REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA public FROM newuser;

回收数据库访问权限

ALTER ROLE newuser NOLOGIN;  -- 回收登录权限

回收其他权限

SET: 允许用户更改会话级别的配置参数。
LOCK TABLES: 允许用户锁定表。
REFERENCES: 允许用户在表上创建外键约束。
…等等。例如,要允许 newuser 更改会话级别的配置参数,你可以执行以下命令:

REVOKE SET ON ALL TABLES IN SCHEMA public FROM newuser;

请注意,在执行 REVOKE 命令之前,请确保你了解这些更改的影响,并确保在生产环境中进行适当的测试。

回收所有表权限

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM newuser;  
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM newuser;  
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM newuser;

回收登录权限(如果需要)

ALTER ROLE newuser NOLOGIN;

12.删除用户

基本语法

DROP ROLE [IF EXISTS] role_name [, ...] [CASCADE | RESTRICT];

IF EXISTS: 这个选项可以防止因角色不存在而引发的错误。
CASCADE: 这个选项将删除与该角色相关的所有权限和依赖项。
RESTRICT: 这个选项将阻止删除与该角色相关的任何权限和依赖项。
DROP ROLE IF EXISTS webuser
DROP ROLE IF EXISTS liutest CASCADE

13.mysql转postgresql后自增ID处理

在 MySQL 中,通常使用 AUTO_INCREMENT 属性来自动增加主键的值。而在 PostgreSQL 中,相应的机制是通过序列(SEQUENCE)和一个与之关联的默认值来实现的。

如果你在使用 Navicat 将 MySQL 数据表复制到 PostgreSQL 数据库时发现没有创建相应的序列,你需要手动创建序列并将其与表的主键关联。以下是创建序列并关联到表的步骤:

  1. 创建序列
    打开 PostgreSQL 数据库的查询窗口,创建一个新的序列。例如,如果你的表名为 my_table,主键列名为 id,你可以创建一个序列如下:
CREATE SEQUENCE my_table_id_seq;
  1. 修改表结构
    接下来,你需要修改表结构,将主键列的默认值设置为刚刚创建的序列的下一个值。例如:
ALTER TABLE my_table ALTER COLUMN id SET DEFAULT nextval('my_table_id_seq');
  1. 设置序列的所有权
    为了确保序列与表的主键列正确关联,并且在删除表时序列也会被删除,你可以设置序列的所有权:
ALTER SEQUENCE my_table_id_seq OWNED BY my_table.id;
  1. 同步序列的值
    如果你已经将数据从 MySQL 表复制到了 PostgreSQL 表中,你可能需要同步序列的当前值,以确保新插入的行不会与现有的行产生主键冲突。你可以设置序列的当前值为主键列的最大值加一:
SELECT setval('my_table_id_seq', COALESCE((SELECT MAX(id)+1 FROM my_table), 1), false);
  1. 测试插入
    在完成上述步骤后,尝试插入一行新数据以确保序列正常工作:
INSERT INTO my_table (column1, column2, ...) VALUES (value1, value2, ...);

如果没有指定 id 列的值,序列应该会自动为新行生成一个唯一的主键值。

请注意,上述 SQL 命令中的 my_tableid 需要替换为你实际的表名和主键列名。如果你的表有多个自增字段,你需要为每个字段创建一个独立的序列并进行相应的设置。

1.数据库编码修改

select pg_encoding_to_char(encoding) from pg_database where datname = ‘liutest’;

方法一:直接修改数据库编码
# 修改 datname 为你的数据库名字,两条命令效果相同,选择一个即可
update pg_database set encoding=6 where datname='postgres';
# 命令2
update pg_database set encoding=pg_char_to_encoding('UTF8') 
where datname='postgres';

方法二:修改模板库编码,一劳永逸。
# 修改模板库template1编码, 同理可修改 template0
update pg_database 
set (encoding, datctype, datcollate)=(6, 'en_US.UTF8','en_US.UTF8') 
where datname = 'template1';

方法三:创建/删除模板库
# 创建模板库,这是一条命令,SQL语法允许命令分行,以分号结束,但回车后,前一行命令不可修改
# 复制前先将第一行的 template1 改成你想要的名字,比如任何简单的名字: td 
create database template1 with 
template template0 
encoding='UTF8' 
lc_ctype='en_US.UTF8' 
lc_collate='en_US.UTF8' 
allow_connections=TRUE 
is_template=True;

# 以后创建数据库指定模板创建即可
create database template mytemplate;

# 也可以一劳永逸,删除原来的 template1, 重新创建即可
# 先将模板库变成普通数据库,使 datistemplate=True 可以将任何普通数据库变成模板库。
update pg_database set datistemplate=False where datname='template1';
# 删除数据库
drop database template1;