1、表空间管理
DM 数据库都是由一个或者多个表空间组成,表空间是一个逻辑的存储容器,它位于逻辑结构的顶层,用于存储数据库中的所有数据,表空间的数据被物理存放在数据文件中,一个表空可以包含一个或多个文件。也就是说表空是逻辑的概念我们可以把它理解为(容器)里面可以存放数据文件、表、索引等。逻辑概念:表空间存放数据文件、表、索引等相关对象。
优点:
1)能够隔离用户数据和数据字典,减少对system 表空间的I/O 争用;
2)可以把不同表空间的数据文件存储在不同的磁盘上,把负载均衡分布到各个磁盘上减少I/O 争用;
3)隔离来自不同应用程序的数据,能够执行基于表空间的备份和恢复同时可以避免一个应用程序的表空间脱机而影响其他应用程序的运行;
1.1 表空间管理
CREATE TABLESPACE DMTEST
DATAFILE '/home/dmdba/dmdbms/dmmpp/DMTEST.DBF' SIZE 128
AUTOEXTEND ON
MAXSIZE UNLIMITED;
-- 扩展表空间
alter tablespace DMTEST add datafile '/home/dmdba/dmdbms/dmmpp/DMTEST1.DBF' size 32;
--修改表空间名称
alter tablespace DMTEST rename to DMTESTSPACE;
-- 移动数据文件位置
alter tablespace DMTEST offline;
alter tablespace DMTEST rename datafile '/home/dmdba/dmdbms/dmmpp/DMTEST.DBF' TO '/home/dmdba/dmdbms/dmmpp/DMTEST2.DBF';
alter tablespace DMTEST online;
-- 删除表空间(谨慎操作)
--删除表空间
DROP TABLESPACE DMTEST;
2、数据文件
数据文件以DBF为扩展名,它是数据库中最重要的文件类型,一个DM数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。
当DM的数据文件空间用完时,它可以自动扩展(创建表空间时设置:AUTOEXTEND ON)。可以在创建数据文件时通过MAXSIZE参数限制其扩展量,当然,也可以不限制。但是,数据文件的大小最终会受物理磁盘大小的限制。在实际使用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择(例如:Oracle单个文件最大32GB)。
-- 查看表空间数据文件信息
select * from dba_data_files;
以下介绍,勿删表空间数据文件恢复过程
2.1 创建表空间
disql SYSDBA/SYSDBA
drop table if exists test.t_student_info;
drop user if exists test;
DROP TABLESPACE if exists DMTEST;
CREATE TABLESPACE DMTEST
DATAFILE '/home/dmdba/dmdbms/dmdata/DMTEST.DBF' SIZE 128
AUTOEXTEND ON
MAXSIZE UNLIMITED;
2.2 新建用户与授权
create user test
identified by "test123456"
default tablespace DMTEST
temporary tablespace TEMP;
grant DBA to test;
2.3 数据表操作
conn test/test123456;
drop table if exists t_student_info;
create table t_student_info(
stu_no bigint,
stu_name varchar2(30),
stu_sex_code char(1),
stu_class varchar2(20)
);
-- 表添加注释
comment on table t_student_info is '学生信息';
-- 列添加注释
comment on column t_student_info.stu_no is '学号';
comment on column t_student_info.stu_name is '姓名';
comment on column t_student_info.stu_sex_code is '性别';
comment on column t_student_info.stu_class is '班级';
-- 插入数据到表中
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10001,'张三','1','三年级2班');
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10002,'李四','1','五年级3班');
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10003,'王琳','2','二年级1班');
commit;
-- 查询表记录
select * from t_student_info;
2.4模拟删除数据文件
shell命令行执行
quit
rm -rf /home/dmdba/dmdbms/dmdata/DMTEST.DBF
ll /home/dmdba/dmdbms/dmdata/DMTEST.DBF
-- 文件检查
[dmdba@dm177 dmdata]$ disql test/test123456
SQL> call SP_FILE_SYS_CHECK();
DMSQL executed successfully
used time: 2.105(ms). Execute id is 57000.
-- 连接数据库,查询数据表
select * from t_student_info;
-- 查看v$datafile,查看表空间信息
select tablespace_name, file_name, status from dba_data_files;
2.5 数据文件恢复
-- 执行函数call sp_tablespace_prepare_recover修复表空间
SQL> call SP_TABLESPACE_PREPARE_RECOVER('DMTEST');
DMSQL executed successfully
used time: 0.832(ms). Execute id is 57003.
-- 执行查看进程命令(数据库启动的进程)
ps -ef |grep dmser
-- 根据进程号,查看文件47为删除的DBF文件(标识:delete)
ll /proc/13501/fd/* |grep DBF
cp /proc/13501/fd/47 /home/dmdba/dmdbms/dmdata/DMTEST.DBF
-- 执行函数sp_tablespace_recover进行恢复操作
disql test/test123456
call sp_tablespace_recover('DMTEST');
-- 文件检查
call SP_FILE_SYS_CHECK();
-- 查询数据文件状态(文件已恢复正常)
select tablespace_name, file_name, status from dba_data_files;
-- 查询表数据
select * from t_student_info;
3、重做日志
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象或者改变数据(DML)操作,DM 都会按照特定的格式(记录内容包含操作类型、表空间号、文件号、页号、页内偏移、实际数据等),将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以 log 为扩展名。
重做日志循环写入,新内容可覆盖旧内容。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 dm01.log、dm02.log。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志属于WAL(Write Ahead Logging),先写重做日志,再写数据文件。当日志文件写入达到一定量时,系统需要清空部分日志,此时将产生检查点,把缓冲区中的日志和脏数据页都写入磁盘,之后即可安全重用。
重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
3.1 查看重做日志文件
select * from v$rlogfile;
3.2 重做日志文件的迁移
首先需要将数据库设置成mount状态,然后再进行文件迁移
alter database mount;
alter database rename logfile '/home/dmdba/dmdbms/data/dm01.log' to '/home/dmdba/dmdbms/data/dm011.log';
alter database open;
select * from v$rlogfile;
3.3扩容重做日志文件大小
可以从上面看到dm011.log的文件大小为256M,将此文件扩容到512M
alter database resize logfile '/home/dmdba/dmdbms/data/dm011.log' to 512;
select * from v$rlogfile;
3.4增加重做日志文件
alter database add logfile '/home/dmdba/dmdbms/data/dm03.log' size 256;
select * from v$rlogfile;
4 回滚表空间
回滚表空间,用于存放回滚数据,当用户修改数据的时候,数据库会把修改之前的值保存起来,这样的数据叫回滚数据(Undo Data),回滚数据有如下用途
1. 事务回滚,回滚未提交的事务
2. 提供一致读
3. 闪回查询
回滚数据在回滚段中一致处于 active 状态,直到下面的情况出现,变为inactive 状态
1. 用户输入rollback命令,回滚这个事务
2. 用户输入commit命令,提交这个事务
3. 用户会话被异常中止(事务被回滚)
4. 用户正常退出登录(事务被提交)
达梦中 ROLL 表空间只能有一个,可以对ROLL表空间添加数据文件,但不能新增ROLL表空间。
4.1 回滚表空间查询
-- 查询回滚段的保留时间,单位为秒(默认:90秒)
select * from V$DM_INI where para_name = 'UNDO_RETENTION';
-- 查看表回滚表空间文件
select tablespace_name, file_name, status from dba_data_files where tablespace_name = 'ROLL';
4.2修改回滚段保留时间
-- 通过执行过程,命令修改
系统过程SP_SET_PARA_VALUE()用于修改静态配置参数和动态配置参数
call SP_SET_PARA_DOUBLE_VALUE(1, 'UNDO_RETENTION', 900);
-- 查看数据
select * from V$DM_INI where para_name = 'UNDO_RETENTION';
-- 通过修改配置文件
如下图配置项UNDO_RETENTION的值为900秒,这里我们改为1800秒
vi /home/dmdba/dmdbms/data/DAMENG/dm.ini
-- 重启数据库
systemctl restart DmServiceDMSERVER.service
4.3 闪回恢复
用户操作不慎,导致错误的删改数据时,非常希望有一种简单快捷的方式,可以快速恢复删改的数据。闪回技术,就是为用户可以迅速处理这种数据逻辑损坏情况而产生的。达梦数据库,闪回功能默认是关闭状态,需要手工开启后才可以支持闪回。
4.3.1 开启闪回功能
-- 查询闪回状态,0-关闭,1-打开
select PARA_NAME,PARA_VALUE,PARA_TYPE from v$dm_ini where para_name like '%FLASHBACK%';
-- 开启闪回功能
alter system set 'enable_flashback'=1 both;
-- 查询
select PARA_NAME,PARA_VALUE,PARA_TYPE from v$dm_ini where para_name like '%FLASHBACK%';
4.3.2 修改回滚段保存时间
-- 查看回滚段记录保存时间(默认90秒)
select PARA_NAME,PARA_VALUE,PARA_TYPE from v$dm_ini where para_name like 'UNDO_RETENTION';
-- 修改回滚段时间
ALTER SYSTEM SET 'undo_retention'=86400 BOTH;
-- 查询
select PARA_NAME,PARA_VALUE,PARA_TYPE from v$dm_ini where para_name like 'UNDO_RETENTION';
4.3.3 数据闪回
-- 创建数据表
create table t_student_info(
stu_no bigint,
stu_name varchar2(30),
stu_sex_code char(1),
stu_class varchar2(20));
-- 插入数据到表中
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10001,'张三','1','三年级2班');
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10002,'李四','1','五年级3班');
insert into t_student_info(stu_no,stu_name,stu_sex_code,stu_class) values (10003,'王琳','2','二年级1班');
commit;
-- 查询表记录
select * from t_student_info;
-- 删除数据
select sysdate;
delete t_student_info;
commit;
select * from t_student_info;
-- 数据闪回恢复
select * from t_student_info WHEN TIMESTAMP '2022-04-24 15:47:42';
select * from t_student_info;
insert into t_student_info select * from t_student_info WHEN TIMESTAMP '2022-04-24 15:47:42';
commit;
select * from t_student_info;
更多产品资料,请查阅官方网站:https://eco.dameng.com