达梦数据库(DM8)基础操作命令
摘要:本文详细介绍了达梦数据库DM8的基础操作命令,涵盖环境准备、实例管理、用户权限、数据库对象、数据操作和备份恢复等核心功能。主要内容包括:1)通过dmsql工具实现本地/远程连接;2)实例启停与状态查看方法;3)用户创建、权限授予与回收操作;4)表空间、表、视图和索引的管理;5)数据增删改查与事务控制;6)使用dmrman工具进行全量和增量备份恢复。文章还提供了常用辅助查询命令和注意事项,如密
达梦数据库(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;
八、注意事项
- 密码策略:达梦默认强制密码复杂度(长度≥8,包含大小写、数字、特殊字符),创建用户时需符合,否则报错。
- 字符集:创建实例时指定字符集(如 UTF-8),后续无法修改,建议统一用 UTF-8。
- 权限控制:避免给普通用户授予 DBA 权限,遵循最小权限原则。
- 备份:定期执行全量 + 增量备份,备份文件需存储在非数据库所在磁盘。
- 语法兼容:达梦兼容 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 语言使用手册》。
更多推荐


所有评论(0)