软件环境

操作系统:openEuler 22.03 LTS

数据库:openGauss 5.0.0LTS(极简版)

官网:软件包 | openGauss

安装准备

目前仅支持在防火墙关闭的状态下进行安装。

# 查看防火墙
sudo ufw staus
# 关闭防火墙
sudo ufw disable

设置字符集

将各数据库节点的字符集设置为相同的字符集,可以在/etc/profile文件中添加“export LANG=XXX”(XXX为Unicode编码)。

vim /etc/profile
export LANG=en_US.UTF-8

设置时区和时间

# 查看当前时区
timedatectl
# 设置时区(上海)
sudo timedatectl set-timezone Asia/Shanghai

安装完开启防火墙,记得开放端口

安装

解压安装包,检查安装目录以及文件是否齐全。在安装包所在目录执行以下命令,/opt/software/openGauss是示例目录,实际解压到本机目录中

tar -jxf openGauss-x.x.x-openEuler-64bit.tar.bz2 -C /opt/software/openGauss
ls -lb

执行ls命令,显示如下信息,解压目录为正常

total 90296
drwx------ 3 root root     4096 Mar 31 21:18 bin
drwx------ 3 root root     4096 Mar 31 21:18 etc
drwx------ 3 root root     4096 Mar 31 21:18 include
drwx------ 4 root root     4096 Mar 31 21:18 jre
drwx------ 5 root root     4096 Mar 31 21:18 lib
drwx------ 5 root root     4096 Mar 31 21:18 share
drwx------ 2 root root     4096 Mar 31 21:18 simpleInstall
-rw------- 1 root root       32 Mar 31 21:18 version.cfg

进入安装目录下的simpleInstall,并安装;注:安装不能使用root用户

# 进入目录
cd /opt/software/openGauss/simpleInstall
# 安装
sh install.sh  -w "Os1234567" &&source ~/.bashrc

说明

  • -w:初始化数据库密码(gs_initdb指定),因安全需要,此项必须设置。
  • -p:指定openGauss端口号,如不指定,默认为5432。
  • -h|–help:打印使用说明。
  • 安装后,该数据库部署节点的名称为sgnode(gs_initdb指定)。
  • 执行时,如果出现报错“the maximum number of SEMMNI is not correct, the current SEMMNI is xxx. Please check it.”,请使用有root权限的用户执行如下命令。
sysctl -w kernel.sem="250 85000 250 330" 
  • 安装后,数据库目录安装路径/opt/software/openGauss/data/single_node,其中/opt/software/openGauss为解压包路径,data/single_node为新创建的数据库节点目录。
  • 安装完成后,默认生成名称为postgres的数据库。第一次连接数据库时可以连接到此数据库。

安装完成后,使用ps和gs_ctl查看进程是否正常。

ps ux | grep gaussdb
gs_ctl query -D /opt/software/openGauss/data/single_node

执行ps命令,显示类似如下信息:

omm      24209 11.9  1.0 1852000 355816 pts/0  Sl   01:54   0:33 /opt/software/openGauss/bin/gaussdb -D /opt/software/openGauss/single_node
omm      20377  0.0  0.0 119880  1216 pts/0    S+   15:37   0:00 grep --color=auto gaussdb

执行gs_ctl命令,显示类似如下信息:

gs_ctl query ,datadir is /opt/software/openGauss/data/single_node
HA state:
    local_role                     : Normal
    static_connections             : 0
    db_state                       : Normal
    detail_information             : Normal

Senders info:
    No information
    
 Receiver info:
No information 

连接Navicat

连接Navicat还需要配置IP访问等等

编辑/opt/software/openGauss/data/single_node(要改为实际路径)下的pg_hbd.conf

#在这里添加访问的IP
# Allow replication connections from localhost, by a user with the
host all all 0.0.0.0/0 md5

编辑/opt/software/openGauss/data/single_node(要改为实际路径)下的postgresql.conf

# 打开listen_addresses的注释,并改为
listen_addresses = '*' 
# 打开password_encryption_type的注释,并改为
password_encryption_type = 0 

:(前提是创建过用户)编辑过这个后要把用户密码修改一下或者新建用户,因为换成了MD5加密方式,修改用户密码命令如下

# 得先进入数据库,才能修改,gsql -d postgres -p 5432

create user root identified by 'Os1234567';

访问OpenGauss

测试连接

# 通过命令行进入数据库,-d是数据库名,-p为端口(如未设置,默认5432)
gsql -d postgres -p 5432
# 创建一个用户以便连接Navicat
create user root identified by 'Os1234567';
alter user root sysadmin;

启动

# 启动OpenGauss。/路径/single_node 为OpenGauss安装路径,如/opt/software/openGauss/data/single_node
gs_ctl start -D  /路径/single_node 
# 停止
gs_ctl stop -D  /路径/single_node 
# 状态
gs_ctl status -D  /路径/single_node 

SqlServer迁移OpenGauss

因为OpenGauss是PGSQL开发的,所以是PGSQL的语法,我使用的是navicat进行数据迁移,navicat的工具中有个数据传输功能,进行数据传输。
注:PGSQL中的数据库索引问题,例如account库中的所有表索引名称都必须不同,否则会有冲突,如account库中不能有两个索引名为index_user_id的索引。

语法

postgreSQL的主键自增

PGSQL中的主键,并不是默认自增的,需要设置

1、使用 SERIAL 类型

这个类型在navicat中还是显示int,因为他本质就是bigint或INTEGER
2、创建序列

SELECT quote_ident(pg_get_serial_sequence('"form_log"', 'id')) AS sequence_name; --查看form_log表的序列


SELECT setval('public.form_log_id_seq', 6000, false); -- 设置form_log表的序列


SELECT last_value, is_called FROM public.form_log_id_seq -- form_log表的序列到多少了

手动创建

CREATE SEQUENCE hierarchy_id_seq; --创建序列
ALTER TABLE hierarchy ALTER COLUMN id SET DEFAULT nextval('hierarchy_id_seq'); --设置默认值
ALTER TABLE hierarchy ADD PRIMARY KEY (id); --主键
SELECT setval('hierarchy_id_seq', 1000, false); --从1000开始

使用代码块来为全表设置序列

DO $$ 代表这是一个匿名代码块,用于在 PostgreSQL 中执行一段 PL/pgSQL 代码。
DECLARE 变量,RECORD是一条记录,
BEGIN END   是 PL/pgSQL 代码块的主体部分,所有的逻辑和操作都在这里执行。
FOR rec IN ... LOOP 循环语句
EXECUTE format('SELECT id FROM %I ORDER BY id DESC LIMIT 1', table_name)	动态执行 SQL 语句
BEGIN EXCEPTION 代表异常处理
table_name || '_id_seq';  || 字符串连接符


DO $$
DECLARE
    var RECORD;
    table_name TEXT;
    max_id BIGINT;
    seq_name TEXT;
BEGIN
    -- 遍历 public 模式下的所有基表
    FOR var IN 
        SELECT table_name
        FROM information_schema.tables
        WHERE table_type = 'BASE TABLE'
          AND table_schema = 'public'
    LOOP
        -- 将表名赋值给变量 table_name
        table_name := var.table_name;

        -- 动态执行 SQL 语句,获取表中最大的 id
        BEGIN
            EXECUTE format('SELECT id FROM %I ORDER BY id DESC LIMIT 1', table_name)
            INTO max_id;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                -- 如果查询没有返回任何行,设置 max_id 为 0
                max_id := 0;
        END;

        -- 输出表名和最大 ID
        RAISE NOTICE '表名:%,条数: %', table_name, max_id + 1;

        -- 设置序列名称
        seq_name := table_name || '_id_seq';

        -- 创建序列
        EXECUTE format('CREATE SEQUENCE IF NOT EXISTS %I', seq_name);

        -- 设置默认值
        EXECUTE format('ALTER TABLE %I ALTER COLUMN id SET DEFAULT nextval(%L)', table_name, quote_ident(seq_name));

--         -- 添加主键(如果还没有)
--         BEGIN
--             EXECUTE format('ALTER TABLE %I ADD PRIMARY KEY (id)', table_name);
--         EXCEPTION
--             WHEN duplicate_key THEN
--                 -- 如果主键已经存在,忽略错误
--                 RAISE NOTICE 'Primary key already exists for table: %', table_name;
--         END;

        -- 设置序列的当前值
        EXECUTE format('SELECT setval(%L, %s, false)', quote_ident(seq_name), max_id + 1);
    END LOOP;
END $$;


Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐