连接

用户安装好 PostgreSQL 实例组件后,可直接通过 PostgreSQL Shell 使用标准的 SQL 语言访问 SequoiaDB 巨杉数据库。

连接PostgreSQL实例组件与存储引擎

  1. 创建 SequoiaSQL PostgreSQL 的 database

    1. $ bin/sdb_pg_ctl createdb sample myinst
  2. 进入 SequoiaSQL PostgreSQL shell 环境

    1. $ bin/psql -p 5432 sample
  3. 加载 SequoiaDB 连接驱动

    1. sample=# create extension sdb_fdw;
  4. 配置与 SequoiaDB 连接参数

    1. sample=# create server sdb_server foreign data wrapper sdb_fdw options(address '127.0.0.1', service '11810', user 'sdbUserName', password 'sdbPassword', preferedinstance 'A', transaction 'off');
    • user:数据库用户名
    • password:数据库密码
    • address:协调节点地址,需要填写多个协调节点地址时,格式为:’ip1:port1,ip2:port2,ip3:port3’,service 字段可填写任意一个非空字符串
    • service:协调节点 serviceName
    • preferedinstance:设置 SequoiaDB 的连接属性,多个属性以逗号分隔,如:preferedinstance ‘1,2,A’,详细配置可参考 preferedinstance 取值
    • preferedinstancemode:设置 SequoiaDB 的连接属性 preferedinstance 的选择模式
    • sessiontimeout:设置 SequoiaDB 的连接属性会话超时时间,如:sessiontimeout ‘100’
    • transaction:设置 SequoiaDB 是否开启事务,默认为 off,开启为 on
    • cipher:设置是否使用加密文件输入密码,默认为 off,开启为 on;密文模式的介绍可参考密码管理
    • token:设置加密令牌
    • cipherfile:设置加密文件,默认为 ~/sequoiadb/passwd

    Note:

    如果用户没有配置数据库密码验证,可以忽略 user 与 password 字段。

  5. 关联 SequoiaDB 的集合空间与集合

    1. sample=# create foreign table test (name text, id numeric) server sdb_server options ( collectionspace 'sample', collection 'employee', decimal 'on' ) ;
    • collectionspace:SequoiaDB 中已存在的集合空间
    • collection:SequoiaDB 中已存在的集合
    • decimal:是否对接 SequoiaDB 的 decimal 字段,默认为 off
    • pushdownsort:是否下压排序条件到 SequoiaDB,默认为 on,关闭为 off
    • pushdownlimit:是否下压 limit 和 offset 条件到 SequoiaDB,默认为 on。开启 pushdownlimit 时,必须同时开启 pushdownsort ,否则可能会造成结果非预期的问题

    Note:

    • 用户所指定的集合空间与集合必须已经存在于 SequoiaDB,否则查询出错。
    • 默认情况下,表的字段映射到 SequoiaDB 中为小写字符,如果强制指定字段为大写字符,可参考注意事项
  6. 更新表的统计信息

    1. sample=# analyze test;
  7. 查询

    1. sample=# select * from test;
  8. 写入数据

    1. sample=# insert into test values('one',3);
  9. 更改数据

    1. sample=# update test set id=9 where name='one';
  10. 查看所有的表(show tables;)

    1. sample=# \d
  11. 查看表的描述信息

    1. sample=# \d test
  12. 删除表的映射关系

    1. sample=# drop foreign table test;
  13. 退出 PostgreSQL Shell 环境

    1. sample=# \q

PostgreSQL与SequoiaDB数据类型映射关系

PostgreSQLAPI注意事项
smallintint32当 API 中的值超过smallint范围时会发生截断
integerint32
bigintint64
serialint32
bigserialint64
realdouble存在精度问题,SequoiaDB 存储时不是完全一致
double precisiondouble
numericdecimal/string在创建外表时,指定选项 decimal 为 ‘on’, numeric 映射对应 decimal ,否则对应 string
decimaldecimal/string在创建外表时,指定选项 decimal 为 ‘on’, decimal 映射对应 decimal ,否则对应 string
textstring
charstring
varcharstring
byteabinary(type=0)
datedate
timestamptimestamp
TYPE[]array仅支持一维数组
booleanboolean
textnull

注意事项

  • 对字母大小写敏感

    SequoiaDB 中的集合空间、集合和字段名均对字母的大小写敏感。

    • 假设 SequoiaDB 中存在集合空间 sample 和集合 employee,在 PostgreSQL 中建立相应的映射表

      1. sample=# create foreign table sdb_upcase_cs_cl (name text) server sdb_server options ( collectionspace 'sample', collection 'employee' ) ;
    • 假设 SequoiaDB 中存在集合空间 sample 和集合 employee,且集合保存如下数据:

      1. {
      2. "_id": {
      3. "$oid":"53a2a0e100e75e2c53000006"
      4. },
      5. "NAME": "test"
      6. }

      在 PostgreSQL 中建立相应的映射表

      1. sample=# create foreign table sdb_upcase_field ("NAME" text) server sdb_server options ( collectionspace 'sample', collection 'employee' ) ;

      查询映射表数据

      1. sample=# select * from sdb_upcase_field;
  • 映射 SequoiaDB 中的数据类型

    假设 SequoiaDB 中存在集合空间 sample 和集合 employee,且集合保存如下记录:

    1. {
    2. "_id": {
    3. "$oid":"53a2de926b4715450a000001"
    4. },
    5. "name": [
    6. 1,
    7. 2,
    8. 3
    9. ],
    10. "id": 123
    11. }

    在 PostgreSQL 中建立相应的映射表

    1. sample=# create foreign table employeetest (name int[], id int) server sdb_server options ( collectionspace 'sample', collection 'employee' ) ;

    查询映射表数据

    1. sample=# select * from employeetest;

调整PostgreSQL配置文件

  1. 查看 PostgreSQL Shell 中默认的配置

    1. sample=#\set
    2. AUTOCOMMIT = 'on'
    3. PROMPT1 = '%/%R%# '
    4. PROMPT2 = '%/%R%# '
    5. PROMPT3 = '>> '
    6. VERBOSITY = 'default'
    7. VERSION = 'PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973], 64-bit'
    8. DBNAME = 'sample'
    9. USER = 'sdbadmin'
    10. PORT = '5432'
    11. ENCODING = 'UTF8'
  2. 调整 PostgreSQL Shell 查询时每次获取记录数

    1. sample=#\set FETCH_COUNT 100

    Note:

    调整配置后,每次获取记录数达到 100 时立即返回记录,然后再继续获取。

    用户直接在 PostgreSQL Shell 中修改配置,只能在当前 PostgreSQL Shell 中生效。如果希望配置永久生效,则需要通过配置文件修改相关配置。修改步骤如下:

    • 获取配置文件路径

      1. $ /opt/postgresql/bin/pg_config --sysconfdir

      输出结果如下:

      1. $ /opt/postgresql/etc

      如果显示目录不存在,则需要手动创建

      1. $ mkdir -p /opt/postgresql/etc
    • 将需要修改的参数写入配置文件中

      1. $ echo "\\set FETCH_COUNT 100" >> /opt/postgresql/etc

      Note:

      用户修改配置后需要重启 psql 使配置生效。

  3. 编辑 /opt/postgresql/data/postgresql.conf 文件,将如下 PostgreSQL Shell 的日志级别:

    1. client_min_messages = notice

    改为:

    1. client_min_messages = debug1
  4. 编辑 /opt/postgresql/data/postgresql.conf 文件,将如下 pg 引擎的日志级别:

    1. log_min_messages = warning

    改为:

    1. log_min_messages = debug1

常见问题处理

如果 PostgreSQL 连接的 SequoiaDB 协调节点重启,在查询时报错

  1. ERROR: Unable to get collection "sample.employee", rc = -15
  2. HINT: Make sure the collectionspace and collection exist on the remote database

解决方法:

重新进入 PostgreSQL Shell

  1. sample=# \q
  2. $ bin/psql -p 5432 sample