侧边栏壁纸
博主头像
winson的blog博主等级

行动起来,活在当下

  • 累计撰写 31 篇文章
  • 累计创建 37 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

人大金仓数据库学习

winson
2024-12-26 / 0 评论 / 0 点赞 / 14 阅读 / 6374 字

人大金仓数据库学习

1. 基本介绍

人大金仓(Kingbase)是一款具有自主知识产权的商业级关系型数据库管理系统,主要特点:

  • 高度兼容PostgreSQL
  • 安全可控
  • 具有完整的自主知识产权
  • 支持国产化平台

2. MySQL迁移重点注意事项

2.1 语法差异

  • 字符串使用单引号(MySQL中双引号也可以)
  • 标识符使用双引号(如表名、字段名)
  • 不支持LIMIT n,m语法,使用LIMIT m OFFSET n
  • 自增序列使用SEQUENCE而不是AUTO_INCREMENT

2.2 数据类型对照表

MySQL数据类型 金仓数据类型 说明
INT INTEGER 整型
DATETIME TIMESTAMP 时间戳
VARCHAR VARCHAR 变长字符串
TEXT TEXT 长文本
FLOAT REAL 单精度浮点
DOUBLE DOUBLE PRECISION 双精度浮点

3. 常用命令对照表

3.1 数据库操作

-- 查看所有数据库
MySQL: SHOW DATABASES;
金仓:  \l 或 SELECT datname FROM pg_database;

-- 查看所有表
MySQL: SHOW TABLES;
金仓:  \dt 或 SELECT tablename FROM pg_tables;

-- 查看表结构
MySQL: DESC table_name;
金仓:  \d table_name;

3.2 序列使用

-- 创建序列
CREATE SEQUENCE seq_name
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

-- 使用序列
CREATE TABLE test_table (
    id INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq_name'),
    name VARCHAR(100)
);

-- 获取下一个值
SELECT NEXTVAL('seq_name');

-- 获取当前值
SELECT CURRVAL('seq_name');

4. 常用管理操作

4.1 用户和权限管理

-- 创建用户
CREATE USER username WITH PASSWORD 'password';

-- 创建角色
CREATE ROLE role_name;

-- 授权
GRANT privilege ON table_name TO user_or_role;

-- 回收权限
REVOKE privilege ON table_name FROM user_or_role;

4.2 备份恢复

-- 备份数据库
kg_dump -h hostname -p port -U username -d dbname -f backup.sql

-- 恢复数据库
ksql -h hostname -p port -U username -d dbname -f backup.sql

5. 性能优化要点

5.1 索引优化

  • 合理使用索引,避免过多索引
  • 经常更新的字段慎用索引
  • 选择性高的列适合建立索引
  • 组合索引注意最左匹配原则

5.2 查询优化

  • 使用EXPLAIN分析查询计划
  • 避免SELECT *,只查询需要的字段
  • 合理使用子查询JOIN
  • 适当使用物化视图

5.3 配置优化

  • shared_buffers:建议设置为系统内存的25%
  • work_mem:排序和哈希操作的内存
  • maintenance_work_mem:维护操作使用的内存
  • effective_cache_size:系统缓存的估计值

6. 开发建议

6.1 良好习惯

  • 使用SCHEMA管理表的命名空间
  • 合理规划表的分区策略
  • 定期进行VACUUM操作
  • 重要操作使用事务保护

6.2 注意事项

  • 字符串必须使用单引号
  • 标识符使用双引号
  • 注意大小写敏感性
  • 使用参数化查询防止SQL注入

7. 常见问题解决

7.1 MySQL迁移常见陷阱

  • 关键字冲突问题

    • 金仓的保留字比MySQL更多,很多表名/字段名在MySQL中可用,在金仓中会报错
    • 常见冲突的字段名:user, group, order, desc, comment, session, date, timestamp
    • 解决方法:
      1. 使用双引号包裹表名/字段名:"user", "group"
      2. 更改表名/字段名,避免使用保留字
      3. 使用schema前缀:schema_name."user"
  • 大小写敏感问题

    • MySQL在Windows下默认大小写不敏感,而金仓严格区分大小写
    • 建议:所有表名和字段名统一使用小写,避免混淆
    • 如果必须使用大写,需要用双引号:"UserTable"
  • 自增列差异

    • MySQL的AUTO_INCREMENT在金仓中不能直接使用
    • 必须先创建序列(SEQUENCE),然后通过DEFAULT NEXTVAL使用
    • 注意序列的所有权和权限设置
  • 字符串处理

    • MySQL中的字符串可以用单引号或双引号,金仓必须用单引号
    • 字符串连接在MySQL中用CONCAT(),金仓使用 || 操作符
    • 字符串函数名称可能不同,如:
      -- MySQL
      SUBSTRING(str, pos, len)
      -- 金仓
      SUBSTR(str, pos, len)
      
  • 日期时间处理

    • 日期格式差异:金仓默认使用 'YYYY-MM-DD' 格式
    • 时间戳精度可能不同
    • 时区处理方式不同
  • 分页查询

    • MySQL的 LIMIT n,m 语法在金仓中不支持
    • 必须改写为 LIMIT m OFFSET n
    • 例如:
      -- MySQL
      SELECT * FROM table LIMIT 10,20;
      -- 金仓
      SELECT * FROM table LIMIT 20 OFFSET 10;
      
  • 函数和存储过程

    • 语法差异较大,需要重写
    • 变量声明和使用方式不同
    • 流程控制语句可能需要调整
  • 事务处理

    • 默认隔离级别不同
    • 锁机制有差异
    • 死锁处理策略不同

7.2 连接问题

  • 检查监听地址和端口配置
  • 确认pg_hba.conf配置正确
  • 验证用户名密码正确性
  • 检查防火墙设置

7.2 性能问题

  • 检查慢查询日志
  • 分析EXPLAIN执行计划
  • 检查系统资源使用情况
  • 优化表结构和索引

8. 实用工具

  • ksql:命令行客户端工具
  • kg_dump:备份工具
  • kg_restore:恢复工具
  • kg_ctl:服务控制工具

9. 参考资源

0

评论区