达梦数据库(DM)是国产自研的关系型数据库,兼容 Oracle 语法,同时有自身特性。以下按环境准备、实例管理、用户权限、数据库对象、数据操作、备份恢复、常用工具 维度,整理超详细的基础操作命令,基于 DM8 版本(主流稳定版)。

一、环境准备:登录与连接

1. 本地登录(dm sql 交互式工具)

dm sql 是达梦自带的命令行客户端,类似 Oracle 的 sqlplus,核心登录方式:

sql

-- 1. 本地直连(默认端口5236)
dmsql SYSDBA/SYSDBA@localhost:5236

-- 2. 简化登录(本地实例,默认用户)
dmsql                         -- 进入后输入用户名/密码:SYSDBA/SYSDBA

-- 3. 指定字符集登录(避免乱码)
dmsql SYSDBA/SYSDBA@localhost:5236 -C UTF-8

-- 4. 执行脚本文件(非交互式)
dmsql SYSDBA/SYSDBA@localhost:5236 -f /home/dm/sql/init.sql

2. 远程登录(IP + 端口)

sql

-- 格式:dmsql 用户名/密码@远程IP:端口
dmsql SYSDBA/SYSDBA@192.168.1.100:5236

-- 带SSL加密登录(需配置SSL)
dmsql SYSDBA/SYSDBA@192.168.1.100:5236 -SSL

3. 退出 dm sql

sql

exit;  -- 或 quit;

二、实例管理(启停、状态查看)

达梦实例操作依赖dm_service工具(服务管理)或dmserver(手动启停),需用 root / 达梦安装用户执行。

1. 查看实例状态

bash

运行

# 方式1:通过服务查看(推荐)
systemctl status DmServiceDMSERVER  # 服务名默认是DmService+实例名

# 方式2:dm sql中查看实例状态
SELECT STATUS$ FROM V$INSTANCE;     -- 返回OPEN表示实例正常启动
SELECT DB_NAME() FROM DUAL;         -- 查看当前数据库名
SELECT VERSION() FROM DUAL;         -- 查看DM版本

# 方式3:工具查看
dmctl service list  # 列出所有达梦服务

2. 启动实例

(1)服务方式(推荐,后台运行)

bash

运行

# 启动服务
systemctl start DmServiceDMSERVER

# 设置开机自启
systemctl enable DmServiceDMSERVER
(2)手动启动(前台 / 后台)

bash

运行

# 前台启动(调试用,终端关闭则实例停止)
cd /dm8/bin
./dmserver /dm8/data/DAMENG/dm.ini

# 后台启动(加&)
./dmserver /dm8/data/DAMENG/dm.ini &

3. 停止实例

(1)优雅停止(推荐)

bash

运行

systemctl stop DmServiceDMSERVER

# 或在dm sql中执行(SYSDBA权限)
SHUTDOWN NORMAL;  -- 正常关闭(等待会话结束)
SHUTDOWN IMMEDIATE;  -- 立即关闭(强制终止会话)
SHUTDOWN ABORT;  -- 强制中止(紧急情况,可能丢失数据)
(2)强制停止(不推荐)

bash

运行

kill -9 <dmserver进程ID>  # 仅紧急情况使用

三、用户与权限管理

达梦用户分为数据库用户(如 SYSDBA)和操作系统用户,以下聚焦数据库用户管理。

1. 内置默认用户

用户名 权限级别 用途
SYSDBA 最高权限 实例管理、用户创建等
SYSAUDITOR 审计权限 审计日志查看、管理
SYSDBO 数据库对象管理 仅操作指定数据库对象

2. 创建用户

sql

-- 基础创建(指定密码、默认表空间)
CREATE USER TEST_USER IDENTIFIED BY "Test@123456"
DEFAULT TABLESPACE MAIN
TEMPORARY TABLESPACE TEMP;

-- 带参数创建(密码有效期、锁定状态)
CREATE USER TEST_USER2 IDENTIFIED BY "Test@123456"
DEFAULT TABLESPACE MAIN
TEMPORARY TABLESPACE TEMP
PASSWORD EXPIRE 90  -- 密码90天过期
ACCOUNT UNLOCK;     -- 账户解锁(默认解锁)

3. 修改用户

sql

-- 修改密码
ALTER USER TEST_USER IDENTIFIED BY "NewTest@123456";

-- 锁定/解锁用户
ALTER USER TEST_USER ACCOUNT LOCK;
ALTER USER TEST_USER ACCOUNT UNLOCK;

-- 修改默认表空间
ALTER USER TEST_USER DEFAULT TABLESPACE USERS;

-- 重置密码有效期
ALTER USER TEST_USER PASSWORD EXPIRE 180;

4. 删除用户

sql

-- 删除无对象的用户
DROP USER TEST_USER;

-- 级联删除(删除用户及所有对象)
DROP USER TEST_USER CASCADE;

5. 权限授予 / 回收

达梦权限分系统权限(如 CREATE TABLE)和对象权限(如 SELECT ON TABLE)。

(1)系统权限

sql

-- 授予创建表、视图权限
GRANT CREATE TABLE, CREATE VIEW TO TEST_USER;

-- 授予DBA角色(包含大部分系统权限)
GRANT DBA TO TEST_USER;

-- 回收权限
REVOKE CREATE VIEW FROM TEST_USER;
(2)对象权限

sql

-- 授予TEST_USER查询SYSDBA下的EMP表权限
GRANT SELECT ON SYSDBA.EMP TO TEST_USER;

-- 授予增删改查权限
GRANT SELECT, INSERT, UPDATE, DELETE ON SYSDBA.EMP TO TEST_USER;

-- 授予权限并允许转授
GRANT UPDATE ON SYSDBA.EMP TO TEST_USER WITH GRANT OPTION;

-- 回收对象权限
REVOKE DELETE ON SYSDBA.EMP FROM TEST_USER;

6. 查看用户 / 权限

sql

-- 查看所有用户
SELECT USERNAME, ACCOUNT_STATUS, DEFAULT_TABLESPACE FROM DBA_USERS;

-- 查看用户拥有的系统权限
SELECT GRANTEE, PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'TEST_USER';

-- 查看用户拥有的对象权限
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE = 'TEST_USER';

四、数据库对象操作(表、视图、索引)

1. 表空间管理(基础)

表空间是达梦存储数据的逻辑单元,默认有 MAIN(默认表空间)、TEMP(临时表空间)。

sql

-- 创建表空间(指定数据文件)
CREATE TABLESPACE USERS
DATAFILE '/dm8/data/DAMENG/users01.dbf' SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;  -- 自动扩展,每次10M,无上限

-- 修改表空间(扩展数据文件)
ALTER TABLESPACE USERS
ADD DATAFILE '/dm8/data/DAMENG/users02.dbf' SIZE 50M
AUTOEXTEND ON NEXT 5M MAXSIZE 200M;

-- 删除表空间(级联删除包含的对象)
DROP TABLESPACE USERS CASCADE;

-- 查看表空间
SELECT TABLESPACE_NAME, STATUS, TOTAL_SIZE/1024/1024 AS TOTAL_MB, FREE_SIZE/1024/1024 AS FREE_MB 
FROM DBA_TABLESPACES;

2. 表操作

(1)创建表

sql

-- 基础建表
CREATE TABLE EMP (
    EMP_ID INT PRIMARY KEY,          -- 主键
    EMP_NAME VARCHAR2(50) NOT NULL,  -- 非空
    DEPT_ID INT,
    SALARY DECIMAL(10,2),
    CREATE_TIME DATE DEFAULT SYSDATE -- 默认当前时间
);

-- 分区表(范围分区)
CREATE TABLE EMP_PART (
    EMP_ID INT,
    EMP_NAME VARCHAR2(50),
    SALARY DECIMAL(10,2),
    CREATE_TIME DATE
)
PARTITION BY RANGE (CREATE_TIME) (
    PARTITION P2024 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD')),
    PARTITION P2025 VALUES LESS THAN (MAXVALUE)
);

-- 临时表(会话级)
CREATE GLOBAL TEMPORARY TABLE TEMP_EMP (
    EMP_ID INT,
    EMP_NAME VARCHAR2(50)
) ON COMMIT PRESERVE ROWS;  -- 提交后保留数据(默认DELETE ROWS)
(2)修改表

sql

-- 添加列
ALTER TABLE EMP ADD (EMAIL VARCHAR2(100));

-- 修改列类型/长度
ALTER TABLE EMP MODIFY (EMP_NAME VARCHAR2(80));

-- 修改列名
ALTER TABLE EMP RENAME COLUMN EMAIL TO EMP_EMAIL;

-- 删除列
ALTER TABLE EMP DROP COLUMN EMP_EMAIL;

-- 添加主键
ALTER TABLE EMP ADD CONSTRAINT PK_EMP_ID PRIMARY KEY (EMP_ID);

-- 添加外键
ALTER TABLE EMP ADD CONSTRAINT FK_DEPT_ID FOREIGN KEY (DEPT_ID) REFERENCES DEPT(DEPT_ID);

-- 重命名表
ALTER TABLE EMP RENAME TO EMPLOYEE;
(3)删除表

sql

-- 普通删除(可通过闪回恢复)
DROP TABLE EMP;

-- 彻底删除(不记录闪回日志)
DROP TABLE EMP PURGE;
(4)查看表信息

sql

-- 查看用户所有表
SELECT TABLE_NAME FROM USER_TABLES;

-- 查看表结构
DESC EMP;  -- 简写
-- 或
SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMP';

3. 视图操作

sql

-- 创建视图
CREATE VIEW V_EMP_DEPT AS
SELECT e.EMP_ID, e.EMP_NAME, d.DEPT_NAME
FROM EMP e
LEFT JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;

-- 创建只读视图
CREATE VIEW V_EMP_READONLY AS
SELECT EMP_ID, EMP_NAME FROM EMP
WITH READ ONLY;

-- 修改视图
CREATE OR REPLACE VIEW V_EMP_DEPT AS
SELECT e.EMP_ID, e.EMP_NAME, d.DEPT_NAME, e.SALARY
FROM EMP e
LEFT JOIN DEPT d ON e.DEPT_ID = d.DEPT_ID;

-- 删除视图
DROP VIEW V_EMP_DEPT;

4. 索引操作

sql

-- 创建普通索引
CREATE INDEX IDX_EMP_DEPT_ID ON EMP(DEPT_ID);

-- 创建唯一索引
CREATE UNIQUE INDEX IDX_EMP_NAME ON EMP(EMP_NAME);

-- 创建组合索引
CREATE INDEX IDX_EMP_DEPT_SALARY ON EMP(DEPT_ID, SALARY);

-- 重建索引(优化性能)
ALTER INDEX IDX_EMP_DEPT_ID REBUILD;

-- 删除索引
DROP INDEX IDX_EMP_DEPT_ID;

-- 查看索引
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS FROM USER_INDEXES WHERE TABLE_NAME = 'EMP';

五、数据操作(DML)

1. 插入数据

sql

-- 单行插入
INSERT INTO EMP (EMP_ID, EMP_NAME, DEPT_ID, SALARY)
VALUES (1, '张三', 10, 8000.00);

-- 多行插入
INSERT INTO EMP (EMP_ID, EMP_NAME, DEPT_ID, SALARY)
VALUES 
(2, '李四', 20, 9000.00),
(3, '王五', 10, 8500.00);

-- 从其他表插入
INSERT INTO EMP_BACKUP (EMP_ID, EMP_NAME)
SELECT EMP_ID, EMP_NAME FROM EMP WHERE DEPT_ID = 10;

2. 查询数据

sql

-- 基础查询
SELECT * FROM EMP;

-- 条件查询
SELECT EMP_NAME, SALARY FROM EMP WHERE SALARY > 8000;

-- 排序
SELECT EMP_NAME, SALARY FROM EMP ORDER BY SALARY DESC;

-- 分组统计
SELECT DEPT_ID, COUNT(*), AVG(SALARY) FROM EMP GROUP BY DEPT_ID HAVING AVG(SALARY) > 8000;

-- 分页查询(达梦特有语法,兼容Oracle)
-- 方式1:ROWNUM(Oracle兼容)
SELECT * FROM (
    SELECT ROWNUM RN, T.* FROM EMP T WHERE ROWNUM <= 20
) WHERE RN >= 10;

-- 方式2:LIMIT(MySQL兼容,DM8支持)
SELECT * FROM EMP LIMIT 10 OFFSET 10;  -- 跳过10行,取10行

3. 更新数据

sql

-- 单条件更新
UPDATE EMP SET SALARY = 8500 WHERE EMP_ID = 1;

-- 多条件更新
UPDATE EMP SET SALARY = SALARY * 1.1, DEPT_ID = 20 WHERE DEPT_ID = 10 AND SALARY < 8000;

-- 关联更新
UPDATE EMP e
SET e.SALARY = e.SALARY * 1.05
WHERE EXISTS (SELECT 1 FROM DEPT d WHERE e.DEPT_ID = d.DEPT_ID AND d.DEPT_NAME = '研发部');

4. 删除数据

sql

-- 条件删除
DELETE FROM EMP WHERE EMP_ID = 3;

-- 批量删除
DELETE FROM EMP WHERE DEPT_ID = 20 AND SALARY < 8000;

-- 清空表(快速清空,不记录日志)
TRUNCATE TABLE EMP;

5. 事务控制

sql

-- 开启事务(默认自动提交,需先关闭)
SET AUTOCOMMIT OFF;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

-- 保存点
SAVEPOINT SP1;
ROLLBACK TO SP1;  -- 回滚到保存点

六、备份与恢复(基础)

达梦备份恢复依赖dmrman工具(专用备份恢复工具),支持全量、增量、日志备份。

1. 全量备份(dmrman)

bash

运行

# 进入dmrman工具
dmrman

# 全量备份实例(备份到指定路径)
BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/backup/full_backup_20250101';

# 退出dmrman
EXIT;

2. 增量备份

bash

运行

dmrman
# 基于全量备份做增量备份
BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' INCREMENTAL BASE ON BACKUPSET '/dm8/backup/full_backup_20250101' TO BACKUP_FILE2 BACKUPSET '/dm8/backup/incr_backup_20250102';
EXIT;

3. 恢复数据库(示例)

bash

运行

dmrman
# 停止实例后执行恢复
RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/full_backup_20250101';

# 恢复后更新数据库
RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/full_backup_20250101';

# 打开数据库
ALTER DATABASE '/dm8/data/DAMENG/dm.ini' OPEN;
EXIT;

4. 查看备份集

bash

运行

dmrman
SHOW BACKUPSET '/dm8/backup/full_backup_20250101';
EXIT;

七、常用工具与辅助命令

1. 常用工具

工具名 用途 核心命令示例
dmsql 交互式 SQL 客户端 dmsql SYSDBA/SYSDBA@localhost
dmrman 备份恢复工具 dmrman BACKUP DATABASE ...
dmctl 实例控制工具 dmctl service start DMSERVER
dmdba 数据库配置助手(图形化) 直接执行 dmdba

2. 常用辅助查询

sql

-- 查看会话
SELECT SESS_ID, USER_NAME, STATUS, CREATE_TIME FROM V$SESSION;

-- 杀死会话
ALTER SYSTEM KILL SESSION 'SESS_ID=12345';

-- 查看锁信息
SELECT LOCK_ID, TABLE_NAME, LOCK_MODE, USER_NAME FROM V$LOCK WHERE TABLE_NAME IS NOT NULL;

-- 查看SQL执行计划
EXPLAIN SELECT * FROM EMP WHERE DEPT_ID = 10;

-- 查看数据库版本
SELECT DB_VERSION() FROM DUAL;

-- 查看表空间使用情况
SELECT 
    TS.NAME AS TABLESPACE_NAME,
    DF.TOTAL_SIZE/1024/1024 AS TOTAL_MB,
    (DF.TOTAL_SIZE - SF.USED_SIZE)/1024/1024 AS FREE_MB,
    ROUND(SF.USED_SIZE/DF.TOTAL_SIZE*100,2) AS USED_RATE
FROM V$TABLESPACE TS
JOIN V$DATAFILE DF ON TS.ID = DF.TS_ID
JOIN V$SEGMENT_FILE SF ON DF.FILE_ID = SF.FILE_ID;

八、注意事项

  1. 密码策略:达梦默认强制密码复杂度(长度≥8,包含大小写、数字、特殊字符),创建用户时需符合,否则报错。
  2. 字符集:创建实例时指定字符集(如 UTF-8),后续无法修改,建议统一用 UTF-8。
  3. 权限控制:避免给普通用户授予 DBA 权限,遵循最小权限原则。
  4. 备份:定期执行全量 + 增量备份,备份文件需存储在非数据库所在磁盘。
  5. 语法兼容:达梦兼容 Oracle 大部分语法,但部分函数(如日期函数)有细微差异,需参考官方文档。

九、存储过程与自定义函数

达梦兼容 PL/SQL 语法,支持存储过程、函数、触发器等可编程对象,是业务逻辑封装的核心。

1. 存储过程(PROCEDURE)

(1)创建存储过程

sql

-- 示例:创建查询员工薪资的存储过程
CREATE OR REPLACE PROCEDURE SP_QUERY_EMP_SALARY(
    IN_EMP_ID IN INT,          -- 输入参数:员工ID
    OUT_SALARY OUT DECIMAL(10,2) -- 输出参数:员工薪资
)
AS
BEGIN
    SELECT SALARY INTO OUT_SALARY 
    FROM EMP 
    WHERE EMP_ID = IN_EMP_ID;
    
    -- 异常处理
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            OUT_SALARY := 0;
            RAISE_INFO('员工ID % 不存在', IN_EMP_ID);
END;
/  -- 达梦PL/SQL块结束符(需手动输入)
(2)调用存储过程

sql

-- 声明变量接收输出结果
DECLARE
    V_SALARY DECIMAL(10,2);
BEGIN
    SP_QUERY_EMP_SALARY(1, V_SALARY);
    PRINT '员工1的薪资:' || V_SALARY;
END;
/

-- 或在dm sql中简化调用(仅输出参数)
CALL SP_QUERY_EMP_SALARY(1, ?);  -- ? 为输出参数占位符
(3)修改 / 删除存储过程

sql

-- 修改(覆盖重建)
CREATE OR REPLACE PROCEDURE SP_QUERY_EMP_SALARY(...);

-- 删除
DROP PROCEDURE SP_QUERY_EMP_SALARY;

2. 自定义函数(FUNCTION)

sql

-- 创建函数:计算员工年薪(含奖金)
CREATE OR REPLACE FUNCTION FN_CALC_ANNUAL_SALARY(
    IN_EMP_ID INT,
    IN_BONUS_RATE DECIMAL(2,1) DEFAULT 0.2 -- 奖金比例,默认20%
)
RETURNS DECIMAL(12,2)
AS
    V_MONTH_SAL DECIMAL(10,2);
    V_ANNUAL_SAL DECIMAL(12,2);
BEGIN
    SELECT SALARY INTO V_MONTH_SAL FROM EMP WHERE EMP_ID = IN_EMP_ID;
    V_ANNUAL_SAL := V_MONTH_SAL * 12 * (1 + IN_BONUS_RATE);
    RETURN V_ANNUAL_SAL;
END;
/

-- 调用函数
SELECT FN_CALC_ANNUAL_SALARY(1) AS ANNUAL_SAL FROM DUAL;
SELECT EMP_ID, FN_CALC_ANNUAL_SALARY(EMP_ID, 0.3) AS ANNUAL_SAL FROM EMP;

-- 删除函数
DROP FUNCTION FN_CALC_ANNUAL_SALARY;

3. 触发器(TRIGGER)

sql

-- 示例:创建插入员工时的审计触发器
CREATE OR REPLACE TRIGGER TRG_EMP_INSERT
BEFORE INSERT ON EMP
FOR EACH ROW  -- 行级触发器
BEGIN
    -- 插入审计日志(需先创建EMP_AUDIT表)
    INSERT INTO EMP_AUDIT (EMP_ID, EMP_NAME, OPER_TYPE, OPER_TIME, OPER_USER)
    VALUES (:NEW.EMP_ID, :NEW.EMP_NAME, 'INSERT', SYSDATE, USER);
END;
/

-- 删除触发器
DROP TRIGGER TRG_EMP_INSERT;

以上是达梦数据库最核心的基础操作命令,覆盖日常运维、开发常用场景,更复杂的操作(如分区表、存储过程、审计)可参考达梦官方《DM8 SQL 语言使用手册》。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐