国产化数据库金仓Linux版部署过程
0.安装包准备
找到你的操作系统对应的平台所支持的软件包下载,我这里下载的是x86(64)的
得到一个镜像文件: 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
去官网找到镜像文件,点击下载即可(点下载需要输验证码和手机号)
二.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 数据库时发现没有创建相应的序列,你需要手动创建序列并将其与表的主键关联。以下是创建序列并关联到表的步骤:
- 创建序列:
打开 PostgreSQL 数据库的查询窗口,创建一个新的序列。例如,如果你的表名为my_table
,主键列名为id
,你可以创建一个序列如下:
CREATE SEQUENCE my_table_id_seq;
- 修改表结构:
接下来,你需要修改表结构,将主键列的默认值设置为刚刚创建的序列的下一个值。例如:
ALTER TABLE my_table ALTER COLUMN id SET DEFAULT nextval('my_table_id_seq');
- 设置序列的所有权:
为了确保序列与表的主键列正确关联,并且在删除表时序列也会被删除,你可以设置序列的所有权:
ALTER SEQUENCE my_table_id_seq OWNED BY my_table.id;
- 同步序列的值:
如果你已经将数据从 MySQL 表复制到了 PostgreSQL 表中,你可能需要同步序列的当前值,以确保新插入的行不会与现有的行产生主键冲突。你可以设置序列的当前值为主键列的最大值加一:
SELECT setval('my_table_id_seq', COALESCE((SELECT MAX(id)+1 FROM my_table), 1), false);
- 测试插入:
在完成上述步骤后,尝试插入一行新数据以确保序列正常工作:
INSERT INTO my_table (column1, column2, ...) VALUES (value1, value2, ...);
如果没有指定 id
列的值,序列应该会自动为新行生成一个唯一的主键值。
请注意,上述 SQL 命令中的 my_table
和 id
需要替换为你实际的表名和主键列名。如果你的表有多个自增字段,你需要为每个字段创建一个独立的序列并进行相应的设置。
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;