GBase 8s 项目运维经验总结

  • Post author:
  • Post category:其他




1. 项目背景

某省发改委社会信用服务管理平台中心建设覆盖全区企业、个人信用基础数据库和信用信息共享平台,推进社会信用体系和联合奖惩机制建设。



2.部署环境

GBase 8s Database Server Version 12.10 vs 中标麒麟v7

官方文档硬件要求如下:

image.png



3 .常见运维命令



3.1 导出一个库的对象结构

1)导出数据库中所有的表结构到文件db.sql

dbschema -d your_database -t all db.sql

2)导出数据库中所有的存储过程到文件db.sql

dbschema -d your_database -f all db.sql

3)导出数据库中的所有对象(包含表,存储过程,触发器…)到文件db.sql

dbschema -d your_database db.sql

4)导出数据库中一个表的结构到文件db.sql

dbschema -d your_database_name -t your_table_name db.sql

5)导出一个存储过程定义到文件db.sql

dbschema -d your_database_name -f your_procedure_name db.sql

6)如果导出更多的表的信息(EXTENT…) 到db.sql

dbschema -d your_database_name -s db.sql

7)导出数据库中对用户或角色的授权信息

dbschema -d your_database_name -p all

dbschema -d your_database_name -r all

8)导出数据库中的同义词

dbschema -d your_database_name -s all



3.2 如何创建数据库用户并附权限

Gbase8s的用户就是操作系统用户,因此要给数据库创建用户,就想当于给操作系统创建用户。

useradd zr_xbzx

passwd zr_xbzx

然后用数据库客户端工具连接到数据库上执行以下语句,给用户赋权:

connect

这是级别最低的一种数据库级别的用户权限。拥有该权限的用户可以执行select、insert、update和delete语句,针对数据表执行存储过程,创建数据表的视图,创建临时表(这样的临时表可以有索引,也可以没有索引)。

Resource

拥有该权限的用户除拥有connect的全部权限以外,他还可以创建新的表,并可以对它自己所创建的表执行alter和drop操作,并可以对这些表创建索引。

DBA

数据库的建立者和拥有者被自动赋予这种权限。拥有该权限的用户除拥有resource的全部权限以外,他还可以对其他用户赋予或解除connect、resource和DBA权限,可以对其它用户创建的表的视图执行drop和alter操作。甚至他还可以对数据库执行drop、start、stop和recover操作。

grant dba to “zr_xbzx”;

grant resource to “zr_xbzx”;

grant connect to “zr_xbzx”;

取消权限:

REVOKE 权限 FROM 用户名



3.3 如何强制并发查询

在查询前执行以下语句

set pdqpriority 80;



3.4 如何强制脏读

在查询前执行以下语句

set isolation to dirty read;



3.5 如何查询前几行数据

如下是查500000到500099行。

select skip 500000 first 100* from tbook_1



3.6 如何修改表的锁模式

alter table tablename lockmode(row);



3.7 kettle如何连utf8字符集的gbase 8s数据库

下载gbase-connector-java.jar包,可以在gbase社区网站上下载

将下载好的jar包放入D:\kettle\data-integration\ext-lib

image.png

custom connection ulr:设置如下

gbasedbt-sqli://192.168.197.138:9088/test2:GBASEDBTSERVER=gbaseserver;CLIENT_LOCALE=zh_cn.GB18030-2000;DB_LOCALE=zh_cn.GB18030-2000;IFX_LOCK_MODE_WAIT=100;NEWCODESET=GB18030,GB18030-2000,5488;DBDATE=Y4MD;



3.8 jdbc连接字串



GB18030库 ,GB18030客户端,GB18030终端

jdbc:gbasedbt-sqli://192.168.120.196:9088/testdb:GBASEDBTSERVER=gbaseserver;CLIENT_LOCALE=zh_cn.GB18030-2000;DB_LOCALE=zh_cn.GB18030-2000;IFX_LOCK_MODE_WAIT=100;NEWCODESET=GB18030,GB18030-2000,5488;DBDATE=Y4MD;



utf8库,UTF8客户端,GB18030终端

jdbc:gbasedbt-sqli://1.1.1.8:8213/g1:GBASEDBTSERVER=ol_gbasedbt1210;CLIENT_LOCALE=zh_cn.utf8;DB_LOCALE=zh_cn.utf8;IFX_LOCK_MODE_WAIT=100;NEWCODESET=GB18030,GB18030-2000,5488;DBDATE=Y4MD;

jdbc:gbasedbt-sqli://1.1.1.8:8213/g1:GBASEDBTSERVER=ol_gbasedbt1210;SQLMODE=Oracle;DB_LOCALE=zh_CN.57372;

在这里插入图片描述



3.9 怎么查询数据库的字符集

SELECT dbs_collate FROM sysmaster:sysdbslocale WHERE dbs_dbsname=‘testdb’;

zh_CN.57372对应的是utf-8

zh_CN.5488对应的是zh_cn.GB18030-2000

informix数据库内部存储用ISO8859-1,jdbc连接时中文显示乱码,informix不支持gbk,必须自己定义NEWCODESET

NEWCODESET格式:

NEWCODESET=JDK-encoding,Ifx-codeset,Ifx-codeset-number

JDK-encoding对应java中的encoding是gbk

ifx-codeset对应数据库中的编码格式,是ISO885901

ifx-codeset-number对应informix数据库编码id,手册中8859-1对应的是819

修改JDBC连接的url配置如下:

jdbc:informix-sqli:ip:port/test:informixserver=test;NEWCODESET=gbk,8859-1,819



3.10 数据库慢应当怎么查

从onstat -u|grep PX看,一般应该没有,如果常有,说明写盘有问题

iostat -xnC2看b%和w%



3.11 长事务的进度如何查看

我早上有一个表删除数据长事务kill后,到现在还没回滚完,有两个小时了

onstat -x|grep RPX

250b562b8 –-RPX–- 23161092 npmuser – 400 435 476617 322481 100809

onstat- x|grep A-R

250c598f0 A-R–- 250b562b84 354766 187899 187903 0x88d23c0 COMMIT 0

187899-187903两个一样了,就回滚完了。



3.12 启动/关闭实例

启动前注意事项

以root或gbasedbt用户登录

确认已指定所需的环境变量、sqlhosts文件、onconfig文件。

第一次启动实例:

oninit -ivy

-i参数为初始化实例时使用,非第一次启动时使用会报错。

非第一次启动实例:

oninit -vy

启动成功后会显示如下结果:



Creating periodic thread…succeeded

Starting scheduling system…succeeded

Verbose output complete: mode = 5

检查当前数据库状态:

onstat –

在线模式时会显示如下结果:

GBase 8s Database Server Version 12.10.FC4G1AEE – On-Line – Up 00:03:28 – 208516 Kbytes

注:On-Line表示在线模式

关闭实例:

onmode -ky

关闭成功后用“onstat -”检查会得到以下结果:

shared memory not initialized for GBASEDBTSERVER ‘servername’



3.13 创建数据空间

1.创建数据文件

创建数据空间需要在先文件系统中创建对应的数据文件

该文件需要属于gbasedbt组、属于gbasedbt用户、权限为660

*建议:我们建议将所有数据文件存放于统一目录下以便管理。

通常,我们需要创建1个根数据空间 rootdbs(需要在数据库初始化之前创建)、至少1个数据空间 datadbs,至少1个临时数据空间tempdbs、1个物理日志空间 plogdbs、1个逻辑日志空间 llogdbs,1个大对象空间sbspace

*rootdbs在数据库实例初始化时已经建好,不需要手动添加。

创建方法:

(1)创建文件(以存储在/opt/dbs目录下为例)

cd /opt/dbs

touch datadbs tempdbs plogdbs llogdbs subspace

chown gbasedbt:gbasedbt datadbs tempdbs plogdbs llogdbs subspace

chmod 660 datadbs tempdbs plogdbs llogdbs subspace

(2)创建物理日志空间:

onspaces -c -d plogdbs -p /opt/dbs/plogdbs -o 0 -s 200000;

-c – 新建一个数据空间

-d – 数据空间名称

-p – 存储文件路径

-o – 偏移量

-s – 数据空间大小(KB)

(3)创建逻辑日志空间

onspaces -c -d llogdbs -p /opt/dbs/llogdbs -o 0 -s 200000;

(4)创建临时数据空间

onspaces -c -d tmpdbs1 -p /opt/dbs/tmpdbs1 -o 0 -s 200000 -t -k 8k;

-t – 创建临时数据空间

-k – pagesize 页大小(默认为2K)

(5)创建数据空间

onspaces -c -d datadbs -p /opt/dbs/datadbs1 -o 0 -s 500000-k 8k;

(6)创建大对象空间

onspaces -c -S sbspace1 -p /opt/dbs/sbspace1 -o 0 -s 500000 -k 8k;

-S – 创建大对象空间

移除数据空间

移除数据空间命令

onspaces -d datadbs –y

-d – 移除一个数据空间

-y – 过程中自动确认

为数据空间添加chunk

只能给数据空间、大对象空间添加chunk

命令:

onspaces -a datadbs1 -p /opt/dbs/datadbs1_2 -o 0 -s 200000

-a – 为数据空间添加chunk

-p – 存储文件



3.14 数据库运行状态

数据库运行时可以使用“onstat”命令配合参数查看一系列系统运行状态。

“onstat”会根据当前环境变量读取对应数据库实例的共享内存,得到想要的结果。

“onstat”用法有很多,这里列出一些常用的供参考。

onstat – 查看最基本的状态信息

onstat -d 查看dbspace和chunk信息

onstat -l 查看物理日志和逻辑日志信息

onstat -p 查看实例整体运行情况

onstat -m 查看数据库实例运行日志(online.log)最后20行信息

onstat -g glo 查看虚拟CPU信息

onstat -g seg 查看内存使用情况

onstat -g ses 查看数据库会话状态(ses后加会话ID可查看指定会话状态)



3.15 gbase 类型

text 不支持用sql插入, 内容不多可以用varchar(320000)代替

bool就是boolean,值是 ‘T’=true, ‘F’= false



3.16 分页查询

select * from user limit 10, 10 可以工作,但是该种模式下,位置不能通过PreparedStatement参数来设置,不要用于编程环境

select skip 2 first 2 * from user 也可以工作,该模式可以通过PreparedStatement参数来设置,推荐在程序中使用



3.17 JDBC解决中文问题(JDBC抛出SQLEXCEPTION,提示出现Locale mismatch)

先以原来身份进入

unset DB_LOCALE CLIENT_LOCALE

解决方案,要在…/profile.gbaseserver 设置

export CLIENT_LOCALE=zh_cn.utf8

export DB_LOCALE=zh_cn.utf8

export SERVER_LOCALE=zh_cn.utf8

执行source …/profile.gbaseserver后,重新导入