# 达梦数据库 ## 1、启动数据库服务 ```shell 服务注册成功后,启动数据库,如下所示: systemctl start DmServicedm.service 停止数据库,如下所示: systemctl stop DmServicedm.service 重启数据库,如下所示: systemctl restart DmServicedm.service 查看数据库服务状态,如下所示: systemctl status DmServicedm.service ``` ## 2、登录达梦数据库 切换目录到大梦数据库的bin目录下 ![img](F:\windows\桌面\分享\fa97b45ae9a8440abcd54fcdd94fd951.png) 登录数据库 ```shell [root@localhost bin]# ./disql SYSDBA/SYSDBA@localhost:5236 ``` 连接项目 ```maven mvn install:install-file -Dfile=F:\DMDb\drivers\jdbc\DmJdbcDriver18.jar -DgroupId=com.dm -DartifactId=DmJdbcDriver -Dversion=1.8.0 -Dpackaging=jar ``` ## 3、创建数据库实例 ### 创建服务 ```shell ./dminit PATH=/home/dm8/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=N CHARSET=1 LENGTH_IN_CHAR=Y DB_NAME=usky_fire BLANK_PAD_MODE=1 LOG_SIZE=2048 INSTANCE_NAME=usky_fire PORT_NUM=5236 ``` #### 注册服务 ```shell ./dm_service_installer.sh -t dmserver -p DMSERVERusky_fire -dm_ini /home/dm8/data/usky_fire/dm.ini ``` #### 删除服务 ```shell ./dm_service_uninstaller.sh -n 实例/服务名(例如:DmServiceSP) ``` ### 创建表空间 ```sql CREATE TABLESPACE alarm_electrical_fire DATAFILE '/home/dm8/data/usky_fire/alarm_electrical_fire.dbf' SIZE 1M AUTOEXTEND ON NEXT 10M; ``` ```sql create tablespace alarm_spray_water datafile '/home/dm8/data/usky_fire/alarm_spray_water.dbf' size 128 autoextend on next 5 cache=normal; ``` #### 查看所有表 ```sql SELECT TABLE_NAME FROM USER_TABLES; ``` #### 将表指定给表空间 ```sql TABLESPACE alarm_electrical_fire; ``` #### 查看所有表空间 ```sql SELECT TABLESPACE_NAME, TABLESPACE_TYPE, TABLESPACE_SIZE FROM SYS_ALL_TABLESPACES; SELECT * FROM V$TABLESPACE; ``` #### 查看指定表空间内的表名 ```sql SELECT TABLE_NAME, COLUMN_COUNT, ROW_COUNT FROM SYS_TABLES WHERE TABLESPACE_NAME = 'alarm_hydrant_water'; SELECT * FROM ALL_TABLES WHERE TABLESPACE_NAME = '表空间名称'; SELECT * FROM DBA_TABLES WHERE TABLESPACE_NAME = 'alarm_spray_water'; ``` #### 查看表属于哪个模式 ```sql SELECT OWNER AS SCHEMA_NAME FROM ALL_TABLES WHERE TABLE_NAME = 'bsc_enterprise_screen'; ``` #### 删除表空间(同时删除数据) ```sql DROP TABLESPACE tablespace_name INCLUDING CONTENTS; ``` #### 只删除表空间而保留其中的数据: 1. 首先,确保没有任何活动会话或事务正在使用要删除的表空间。 2. 在达梦数据库中创建一个新的表空间,用于迁移表和数据。可以使用以下语句创建新表空间: ```sql CREATE TABLESPACE new_tablespace_name DATAFILE 'path_to_datafile' SIZE 100M; ``` 在上述语句中,`new_tablespace_name`是新表空间的名称,`path_to_datafile`是数据文件的路径和名称,`SIZE 100M`是指定表空间的大小。 3. 将要保留的表和数据迁移到新的表空间中。可以使用以下语句将表移动到新表空间: ```sql ALTER TABLE table_name MOVE TABLESPACE new_tablespace_name; ``` 在上述语句中,`table_name`是要移动的表的名称,`new_tablespace_name`是目标表空间的名称。 4. 确保所有表都已成功迁移到新表空间后,可以将旧表空间删除。使用以下语句删除表空间: ```sql DROP TABLESPACE old_tablespace_name INCLUDING CONTENTS; ``` 在上述语句中,`old_tablespace_name`是要删除的旧表空间的名称。`INCLUDING CONTENTS`参数可以选择是否删除表空间中的所有对象和数据。 ## 4、执行`SQL`脚本 两种操作,当然需要登录到数据库中才能操作(导出`dexp、dmp`文件不需要登录数据库) ```shell 1 # start + 脚本的绝对路径 2 SQL> start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql run /path/to/sql/file.sql; @/path/to/sql/file.sql; ``` ```shell 1 # ` + 脚本的绝对路径 2 SQL> `start /home/dm8/data/usky_fire/alarm_hydrant_water(DM).sql ``` ## 5、导出`dmp`文件 使用`dexp`进行导出,切换到达梦的bin目录下,可以看到有一个`dexp`文件,使用它进行导出的操作 ```shell 1 ./dexp 用户id/密码@ip:5236 file=导出的文件 directory=导出文件所在的目录 导出的模式 ``` 导出模式:`FULL、OWNER、SCHEMAS、TABLES` ;全部导出、根据用户导出、根据模式导出和表导出。 ```shell 1 # 全部导出 2 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data FULL=y 3 # 根据模式导出 4 [root@localhost bin]# ./dexp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE ``` ## 6、导入`dmp`文件 使用`dimp`进行导入,依旧需要切换到达梦的bin目录下,同样也会有一个`dimp`文件,使用这个文件进行导入操作 ```shell 1 ./dimp 用户id/密码@ip:5236 file=导入的文件 directory=导入文件所在的目录 导入的模式 ``` 和导出一样,导入也是同样的四个模式 ```shell 1 #根据模式进行导入 2 [root@localhost bin]# ./dimp SYSDBA/SYSDBA@localhost:5236 file=imp_exp.dmp directory=/dm7/data SCHEMAS=NINGDATABASE ``` ## 7、执行`SQL`脚本和`dmp`文件 - 修改操作较少或者修改的东西比较集中的情况下可以直接使用导出SQL脚本然后登录数据库执行SQL脚本进行同步操作;SQL脚本的执行默认是直接commit(直接执行SQL需要手动进行commit) - 其他比较复杂的操作或者数据量大可以使用导出dmp文件,具体的导出导入模式根据自己的需要进行选择 - dmp文件或者dexp文件进行操作时,导出和导入模式要一致 ## SQL命令 ### 查询数据库版本 ```sql select * from v$version; ``` ### 查看授权信息 ```sql select * from v$license; ``` ### 查看达梦数据库库名 ```sql select name,create_time from v$database; ``` ### 查看大小写配置是否敏感 --大小敏感(1为大小写敏感,0为大小写不敏感) ```sql SELECT SF_GET_CASE_SENSITIVE_FLAG(); 或 SELECT CASE_SENSITIVE(); SELECT SF_GET_CASE_SENSITIVE_FLAG(); ``` ### 查询数据库最大连接 ```sql select SF_GET_PARA_VALUE(2,'MAX_SESSIONS'); ``` ### 查看达梦数据库当前状态 ```sql select status$ from v$instance; ``` ### 查询授权截止有效期 ```sql select EXPIRED_DATE from v$license; ``` ### 查询数据文件位置 ```sql select GROUP_ID , ID ,path,STATUS$ from v$datafile; ``` ### 查询表空间大小 ```sql select FILE_NAME,FILE_ID,TABLESPACE_NAME,BYTES/1024/1024||'M' from dba_data_files; ``` ### 查询表空间使用情况 ```sql select t1.NAME tablespace_name, t2.FREE_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' free_space, t2.TOTAL_SIZE*SF_GET_PAGE_SIZE()/1024/1024 ||'M' total_space, t2.FREE_SIZE*100/t2.total_size "% FREE" from V$TABLESPACE t1, V$DATAFILE t2 where t1.ID=t2.GROUP_ID; ``` ### 查询所有SCHEMA ```sql select * from dba_objects where object_type='SCH'; ``` ### 查询所有用户 ```sql select username from dba_users; ``` ### 切换SCHEMA ```sql set schema "testSchema"; ``` ### 创建SCHEMA ```sql CREATE SCHEMA "testSchema"; ``` ### 查询模式下全量表名称 ```sql select TABLE_NAME from all_tables WHERE OWNER='testSchema'; ``` ### 删除SCHEMA ```sql drop schema "testSchema"; ``` ### 列注释 ```sql COMMENT ON COLUMN testSchema.peoples.role_id is '角色Id'; ``` ### 查询列注释 ```sql select * from SYSCOLUMNCOMMENTS where SCHNAME='testSchema' and TVNAME='peoples' and COLNAME='role_id'; ``` ### 表注释 ```sql comment on table testSchema.peoples is '这是一个表注释'; ``` ### 查询表注释 ```sql select * from SYSTABLECOMMENTS where SCHNAME='testSchema' and TVNAME='peoples'; ``` ```sql SELECT COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'alarm_electrical_fire'; ``` ### 创建表空间 ```sql CREATE TABLESPACE MANAGEMENT DATAFILE 'MANAGEMENT.DBF' SIZE 128; ``` ### 查看表空间 ```sql select * from dba_data_files; select * from dba_tablespaces; select * from v$tablespace; ``` ### 创建用户 ```sql CREATE USER usky_cloud IDENTIFIED BY "usky666" DEFAULT TABLESPACE MANAGEMENT; GRANT DBA TO testSchema; GRANT DBA TO usky_cloud; ``` ### 查看当前实例的连接数 ```sql select clnt_ip,user_name,state,count(*) from v$sessions group by clnt_ip,user_name,state; ``` 查询 dba_segments 需要Dba权限,用户没有Dba权限时查询 all_tables 或 user_tables 某模式下所有表名 需要DBA权限 AND SEGMENT_NAME LIKE 'CD_%' ```sql select owner,SEGMENT_NAME as tbName from dba_segments where segment_type='TABLE' and OWNER ='模式名' ``` 查看模式下所有表 不需要DBA权限 and TABLE_NAME LIKE 'CD_%' ```sql select TABLE_NAME as tbName from all_tables where OWNER ='模式名' ``` 用户下所有表 where table_name like 'CD_%' ```sql select table_name as tbName from user_tables group by TABLE_NAME ``` ## 1.1 启动数据库 ```sql cd /home/dmdba/dmdbms/bin ./dmserver /home/dmdba/dmdbms/DAMENG/dm.ini ``` ### 1.2 连接数据库 ```sql ./disql SYSDBA/SYSDBA@localhost:5236 ``` ### 1.3 使用DISQL直接执行命令 ```sql cd /home/dmdba/dmdbms/bin ./disql SYSDBA/SYSDBA -E "select * from t1" ``` ### 1.4 数据库版本 ```sql select *,id_code from v$version; ``` ### 1.4 数据库信息 ```sql select * from v$database; ``` ## 2 数据库对象 ### 2.1 表 ```sql // 查看表结构 SQL > describe table // 查看表的模式名 select owner from dba_tables where table_name='T1'; // 查看数据库中的表 select * from dba_tables; // 查看建表语句 sp_tabledef('SYSDBA','T1'); -- 模式名,表名,注意都要大写。 SELECT DBMS_METADATA.GET_DDL('TABLE',表名,模式名); // 参考 DBMS_METADATA 系统包 SELECT DBMS_METADATA.GET_DDL('TABLE','T1','SYSDBA'); // 例句 ``` ### 2.2 LICENSE ```sql SQL > SELECT * FROM V$LICENSE; ``` ## 3 数据库操作 ### 3.1 开启归档日志 ```sql //修改数据库为MOUNT状态 ALTER DATABASE MOUNT; //配置本地归档 ALTER DATABASE ADD ARCHIVELOG 'DEST = /dmdata/dameng/arch_dsc0, TYPE = local, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16,HANG_FLAG=1'; //配置远程归档 ALTER DATABASE ADD ARCHIVELOG 'DEST = DSC1, TYPE = REMOTE, FILE_SIZE = 1024, SPACE_LIMIT = 2048, ARCH_FLUSH_BUF_SIZE=16, INCOMING_PATH = /dmdata/dameng/arch_dsc1'; //开启归档模式 ALTER DATABASE ARCHIVELOG; //修改数据库为OPEN状态 ALTER DATABASE OPEN; ``` ### 脱机完全备份(RMAN) ```sql // 必须开启归档并已生成归档日志 dmdba@else-virtual-machine:~/dmdbms/bin$ ./dmrman dmrman V8 RMAN> BACKUP DATABASE '/home/dmdba/dmdbms/DAMENG/dm.ini' FULL BACKUPSET '/else/bakup_dm'; ``` ### 3.3 联机完全备份(disql) ```sql SQL> BACKUP DATABASE TO WEEKLY_FULL_BAK BACKUPSET '/backup/dmdb/online'; SQL> BACKUP DATABASE FULL BACKUPSET '/backup/dmdb/online'; ``` ### 数据库表备份 ```sql SQL> BACKUP TABLE t1 BACKUPSET '/backup/dmdb/t1_bak_01'; ``` ### 数据库表恢复 ```sql // 前提: 表必须存在 SQL> RESTORE TABLE t1 FROM BACKUPSET '/backup/dmdb/t1_bak_01'; ``` ## 4 主从复制 ### 4.1 查看数据库模式 ```sql // 数据库状态查看 SQL> select status$ from v$instance; // 数据库模式查看 SQL> select MODE$ from v$instance; ``` ### 4.2 查看主备运行情况 ```sql SQL> select * from V$ARCH_STATUS SQL> select * from V$RLOG_RAFT_INFO ```