因为国产化,数据库采用国产的人大金仓,原先存放于oracle 12c的数据也要迁移过来。
人大金仓,改自开源的数据库项目pg(postgreSql),这点人大金仓自己也承认。因此目前查人大金仓,如果资料匮乏,直接查pg也是可以的,高度相似。不过这也可以理解,先解决有无的问题,用一个开源的框架进行修改,等完全吃透了,人才也储备了,就可以推陈出新,青出于蓝。操作系统、数据库、中间件、基础应用软件(如matlab这类),都掌握在自己人手里。
数据由oracle迁移到人大金仓KingBase8,步骤是什么呢?
一、人大金仓里创建数据库、表空间和模式
1、表空间(TableSpace)和模式(Schema)的基本概念
oracle有表空间和schema,人大金仓也有。表空间是一个物理存储的概念,存储数据文件、索引文件之类。而schema是一个逻辑概念,对应数据库的关系模式,如表结构,字段类型,视图定义等等。
在oracle里,好像没有什么地方去创建、修改这个schema,有的只有创建表空间,然后似乎schema名称跟表空间名称天然保持一致,往往让人将二者等同起来。而在人大金仓里面,可以独立操作这个schema(模式),一个数据库可以对应多个表空间,而表空间也可以被多个数据库所用。在oracle中,表空间更像是一个命名空间,逻辑概念;而人大金仓里面,表空间本质是一个文件夹。
人大金仓的表空间(TableSpace)和模式(Schema)
2、操作命令
人大金仓提供了图形化的数据库对象管理工具,可以用于创建数据库、表空间,模式,查询数据,等等。不过最方便的,还是用它的命令行。
1)登录数据库
操作系统终端里,输入:
ksql -h 127.0.0.1 -U 账号 -d 数据库名称
- 1
这样输入密码后,就进入到kingbase的命令行或者说,进入了kingbase的终端。
2)退出人大金仓终端,回到操作系统终端
\q
- 1
一个斜杠加一个q。kingbase的命令,以一个斜杠开头。sql的话就直接写。
3)切换账号或数据库
登录的时候是指定账号和数据库的。进去以后,如果想切换账号或数据库,不必退出再进这么麻烦。可以
\c 数据库名 账号名
- 1
这样就以新的账号进入了新的数据库
4)创建及删除表空间
GZFBC=# create tablespace gzfbc location '/home/chenqu/data/gzfbc';
CREATE TABLESPACE
GZFBC=# drop tablespace GZFBC;
DROP TABLESPACE
- 1
- 2
- 3
- 4
- 5
删除表空间,需要表空间是空的,并没有被使用。
4-1)修改数据库默认表空间
GZFBC=# alter database GZFBC set tablespace HYDG;
错误: 无法改变当前已打开数据库的表空间
- 1
- 2
注意当前数据库是不能修改自己的。因此应该切换到别的数据库,再操作。
5)查看当前实例下的所有表空间
GZFBC=# \db
GZFBC | SYSTEM | /home/chenqu/data/gzfbc
SYS_DEFAULT | SYSTEM |
SYS_GLOBAL | SYSTEM |
- 1
- 2
- 3
- 4
6)查看当前数据库下的所有模式
GZFBC=# \dn
List of schemas
Name | Owner
--------------------+--------
GZFBC_HYDG | WORK
HYDG | SYSTEM
INFORMATION_SCHEMA | SYSTEM
PUBLIC | SYSTEM
SYSAUDIT | SYSTEM
SYSLOGICAL | SYSTEM
XLOG_RECORD_READ | SYSTEM
(7 rows)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
7)查看当前模式下的表
GZFBC=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+--------
PUBLIC | PATHMAN_CONFIG | table | SYSTEM
PUBLIC | PATHMAN_CONFIG_PARAMS | table | SYSTEM
(2 rows)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
8)查看表结构
GZFBC=# \d catchresult
CATCHRESULTID | NUMERIC(18,0) | not null
WEBSITEID | NUMERIC(18,0) | not null
CATEGORYID | NUMERIC(18,0) | not null
WEBPAGEID | NUMERIC(18,0) | not null
TITLE | CHARACTER VARYING(300 byte) | not null
URL | CHARACTER VARYING(300 byte) | not null
CREATEDATE | TIMESTAMP WITHOUT TIME ZONE | not null
CONTENT | CLOB |
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
9)管理员和普通账户
留意到如果是管理员,其命令后接“#”号,普通账户,后接“>”号
二、数据迁移
数据库迁移使用人大金仓提供的迁移工具。名字就叫“数据迁移工具”。
1、首先建立好源数据库和目标数据库2个连接。
2、数据迁移
创建一个数据迁移任务,选好源、目标数据库,一步一步走就好了。还行。
3、表空间及模式
迁移到kingbase的时候,系统默认是oracle的schema跟kingbase的一样,如果kingbase上还没有相应的schema,系统会自动创建一个。当然迁移前可以设置。如果导入之后才发现,还可以调整:
1)schema改名
GZFBC=# ALTER SCHEMA HYDG rename to GZFBC_HYDG;
ALTER SCHEMA
- 1
- 2
设置用户work的默认schema。注意schema改名字以后,原先的默认设置会失效,需要重新指定一遍。
GZFBC=# ALTER USER "work" set search_path to GZFBC_HYDG;
- 1
2)赋权限
人大金仓的权限分为三级:数据库级,模式级,以及模式下面的对象。将某模式的owner设为某账户,那么正常情况下,模式下面的表、视图等,该账户都可以顺理成章地拥有全部权限。但这只限于正常情况下。如果是数据迁移进来到某模式的,好像就没有这个继承关系。但我不确定是不是这样,因为我操作了许多,又是改名又是换owner。
假如账号没有拥有模式下辖的对象的权限,怎么办呢?只能手动赋权:
grant all on all sequences in schema GZFBC_HYDG to "work";
grant all on all tables in schema GZFBC_HYDG to "work";
- 1
- 2
3)查看数据库对应的表空间
select d.datname,p.spcname from sys_database d, sys_tablespace p where d.datname='数据库名称' and p.oid = d.dattablespace;
- 1
三、小结
目前的人大金仓,基本上跟pg非常相像,感觉只是简单地将系统表的前缀从pg_改成了sys_。查阅到的pg资料,好像都能用上。
有一个比较奇怪的地方,就是数据库名,用户名,系统会自动变成大写,就算我们写的时候,刻意用小写来进行书写。kingbase是区分大小写的,像账号这些。但SQL例外。因此如果真的要用小写,应该用双引号将名字包起来。为什么会有这种规定,感觉设计者的脑袋被驴子踢过。