目录
2-2、重新下载最新版本的数据库安装(包括旧数据的导出与导入)
[2-2-1、打开 CMD,进入旧 DM 的 bin 目录](#2-2-1、打开 CMD,进入旧 DM 的 bin 目录)
[3-2-4、修改用户默认表空间(防止后续新建表继续落到 MAIN)](#3-2-4、修改用户默认表空间(防止后续新建表继续落到 MAIN))
1、问题背景
先前,我在本地安装了WINDOWS版本的达梦数据库进行开发学习,但是,突然有一天遇到了这个提示的情况。


2、解决方案尝试
2-1、咨询官方客服申请可延续的授权使用期
通过以下查询语句获取安装的DM数据库的基本信息
sql
SELECT * FROM V$VERSION;
SELECT * FROM V$LICENSE;


告知达梦客服后,但被告知个人用户申请延期的证书KEY的流程更繁琐,建议直接下载新版本的达梦数据库来解决目前所看到的问题。于是乎,我不得不考虑通过重新安装数据库的途径来解决目前遇到的问题。此处,需要特别考虑旧数据库的导出备份与导入新数据库的操作。
2-2、重新下载最新版本的数据库安装(包括旧数据的导出与导入)
2-2-1、打开 CMD,进入旧 DM 的 bin 目录
bash
dexp SYSDBA/SYSDBA密码@localhost:5236 FILE="D:\dm_backup\testdb_full.dmp" LOG="D:\dm_backup\dexp.log" FULL=Y
备注: 路径 D:\dm_backup 提前建好。FULL=Y ,表示整库导出。另外的,最好再补充一个参数:TABLE_SPACE=Y,因为,在后续进行操作的时候,才发现不添加这个参数的话,先前创建的表空间目录,将会无法被成功导入到新的数据库中。
2-2-2、停止达梦数据库服务

2-2-3、卸载停止达梦数据库服务

2-2-4、清理残留目录
手动清除以下目录(存在的话):
D:\dmdba\dmdbms\data
D:\dmdba\dmdbms\arch
2-2-5、安装新版本的达梦并创建数据库服务
**备注:**新建的数据库需要各方面参数与原数据库服务保存一致,避免后续导入操作时候出现报错。
可以预先查看了解原数据库的各个方面的基础参数。
2-2-6、导入dmp,恢复数据(dimp)
bash
cd D:\dmdba\dmdbms\bin
dimp SYSDBA/新SYSDBA密码@localhost:5236 FILE="D:\dm_backup\testdb_full.dmp" LOG="D:\dm_backup\dimp_import.log" FULL=Y
2-2-7、登录新版本的数据库验证证书有效期与数据恢复情况
3、遇到原先创建的表空间没有成功被迁移
原因:dexp/dimp 属于【逻辑备份】,它不保存物理 dbf 文件的磁盘路径! 逻辑备份保存的是:建表空间、建表、插入数据的 SQL 定义;不会直接还原到原来 C:/D 盘那个物理文件位置,这是原理层面的问题。
3-1、解决方案1
导出命令中添加参数:TABLE_SPACE=Y:
bash
dexp SYSDBA/旧密码@localhost:5236 FILE="D:\dm_backup\testdb_full.dmp" LOG="D:\dm_backup\dexp_export.log" FULL=Y TABLESPACE=Y
重建数据库实例
重新导入数据:
bash
dimp SYSDBA/新密码@localhost:5236 FILE="D:\dm_backup\testdb_full.dmp" LOG="D:\dm_backup\dimp_import.log" FULL=Y
3-2、解决方案2
由于,已经将老数据库服务删除,无法做重新导出操作的时候,考虑以下的操作步骤。
3-2-1、停止达梦数据库服务
3-2-2、迁移表从MAIN迁移到目标表空间
确定之前表空间文件.dbf文件所在的目录位置
3-2-3、重建索引(迁移表之后必须做)
3-2-4、修改用户默认表空间(防止后续新建表继续落到 MAIN)
3-2-5、验证结果
我把自己迁移与验证的执行命令整理成了一个模板步骤如下:
sql
--STEP-1:
CREATE TABLESPACE TS_{你的用户名} DATAFILE 'D:\dmdba\dmdbms\data\IRAC\TS_{你的用户名}.DBF' SIZE 128;
--STEP-2:将查询得到的结果做批量执行
SELECT 'ALTER TABLE '||OWNER||'.'||TABLE_NAME||' MOVE TABLESPACE TS_{你的用户名};'
FROM SYS.DBA_TABLES
WHERE OWNER = '{你的用户名}' AND TABLESPACE_NAME = 'MAIN';
--STEP-3:将查询得到的结果做批量执行
--SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD TABLESPACE TS_{你的用户名};'
--如果索引表空间和数据表空间一致REBUILD之后内容可以省略
SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD;'
FROM SYS.DBA_INDEXES
WHERE OWNER = '{你的用户名}' AND TABLESPACE_NAME = 'MAIN';
--STEP-4:
--更新用户下所有表统计信息
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME => '{你的用户名}', CASCADE => TRUE);
END;
--STEP-5:
ALTER USER {你的用户名} DEFAULT TABLESPACE TS_{你的用户名};
--STEP-6:
--检查表
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME FROM SYS.DBA_TABLES WHERE OWNER = '{你的用户名}';
--检查索引
SELECT OWNER, INDEX_NAME, TABLESPACE_NAME, STATUS FROM SYS.DBA_INDEXES WHERE OWNER = '{你的用户名}';
--检查所有数据文件路径
SELECT TABLESPACE_NAME, FILE_NAME FROM SYS.DBA_DATA_FILES;
--验证统计信息更新时间
SELECT TABLE_NAME,LAST_ANALYZED FROM SYS.DBA_TABLES WHERE OWNER = '{你的用户名}';
特别提醒: 数据表迁移成功后,**所有索引会变成无效状态(STATUS=INVALID)。**因此,需要特别注意对索引的迁移与验证。