DCA培训心得笔记(二)

DM8产品使用

删除归档日志文件

#开启归档
alter database mount;
alter database ARCHIVELOG;
alter database add ARCHIVELOG 'type=local, dest=/dm8/arch, file_size=64,space_limit=10240';
alter database open;

归档开启后会生成一个归档日志文件,该归档文件运行在active状态下,可以用如下语句查询:

SQL> select * from SYS."V$ARCH_FILE";

在这里插入图片描述
参数ARCH_LSN可以理解为归档文件的头,CLSN理解为归档文件的尾。一头一尾记录了归档文件的记录的片段。
使用: SF_ARCHIVELOG_DELETE_BEFORE_LSN参数可以删除归档日志文件。

当归档文件处于active状态下,该参数无法删除正在运行的归档文件,所以需要先将归档文件变为inactive状态:将数据库转换为mount状态再转换为开启状态,此时之前的归档文件则会变成inactive状态,同时由于开启了归档,会自动生成一个新的active状态的归档文件。
在这里插入图片描述

此时可以删除inactive的归档文件。
可以看到第一个归档文件的ARCH_LSN为82820,CLSN为84324。
当我这样删除时:

select sf_archivelog_delete_before_lsn(82820);

在这里插入图片描述
参数返回值为0,代表没有删除任何归档文件,这是因为该参数的作用是删除该lsn值之前的归档文件,所以其实上面的语句删除的是82820之前的归档文件,所以删不掉这里的第一条归档。那么将语句改为:

select sf_archivelog_delete_before_lsn(84324);

在这里插入图片描述
结果仍然返回1,我理解为要删除一个归档文件,不能删除其片段,只能整个删除,这一行语句实际操作的是删除84324之前的归档文件也就是把LSN值为1至84323之间的归档文件删除,但是我们的第一个归档文件的尾是84324,所以该语句没有完全删除我们的第一条归档文件,也就默认不删除。
此时将语句改成:

select sf_archivelog_delete_before_lsn(84325);

在这里插入图片描述
成功删除了第一条inactive的归档文件。
再尝试:看看能否删除active的归档文件

select sf_archivelog_delete_before_lsn(100000);

在这里插入图片描述证实无法删除正在运行的归档文件。
此时关闭归档:

#关闭归档
alter database mount;
alter database NOARCHIVELOG;
alter database delete ARCHIVELOG 'type=local, dest=/dm8/arch, file_size=64,space_limit=10240';
alter database open;

可以发现查不到任何归档文件记录:
在这里插入图片描述重新开启归档:

在这里插入图片描述由于之前的归档文件因为数据库转换过mount状态而变成inactive,同时因为开启了归档,生成了一个新的归档文件,同时因为关闭过归档,会发现两个归档文件的LSN值不是连续的,而之前没有关闭归档时,inactive和active的归档文件之间得LSN值都是连续的。如果LSN值不连续,当进行归档文件备份的时候会报错:归档文件不连续,这个时候就需要删除不需要的归档文件,保证归档文件的连续性。

backup ARCHIVE LOG ALL to ARCHFULLBAK backupset '/dm8/backup/ARCHFULLBAK';

ODBC配置

将odbc安装包放在opt目录下解压:

tar -xzvf unixODBC-2.3.0.tar.gz
#进入unixODBC-2.3.0目录下源码安装
./configure
make
make install
#安装好后配置驱动信息和数据源信息
#配置信息文件默认在usr/local/etc下
cat odbc.ini
[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236

cat odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /dm8/bin/libdodbc.so

#测试数据源
odbcinst -j

#启动
isql dm8 -v

#退出
quit 或ctrl+c

故障模拟:表空间数据文件丢失

#创建表空间
create tablespace tbs DATAFILE 'TBS01.DBF' SIZE 32;
#备份表空间
backup tablespace tbs to TBSFULLBAK01 backupset '/dm8/backup/TBSFULLBAK01';
#删除表空间数据文件模拟故障
rm TBS01.DBF
#关闭数据库
./DmServiceDMSERVER stop
#表空间还原 dmrman
restore database '/dm8/data/DAMENG/dm.ini' tablespace tbs from backupset  '/dm8/backup/TBSFULLBAK01';
#表空间恢复 dmrman
recover database '/dm8/data/DAMENG/dm.ini' tablespace tbs;

故障模拟:SYSTEM表空间数据文件丢失

#数据库备份
backup DATABASE;
backup DATABASE full to FULLBAK01 BACKUPSET '/dm8/backup/FULLBAK01';
backup database INCREMENT to INCRBAK01 BACKUPSET '/dm8/backup/INCRBAK01';
backup database INCREMENT to INCRBAK02 BACKUPSET '/dm8/backup/INCRBAK02';
backup database INCREMENT CUMULATIVE to INCRBAK03 BACKUPSET '/dm8/backup/INCRBAK03';
backup database INCREMENT WITH BACKUPDIR '/dm8/backup/full' to INCRBAK04 BACKUPSET '/dm8/backup/INCRBAK04';

#删除数据文件
rm SYSTEM.DBF
#关闭数据库
./DmServiceDMSERVER stop
#还原
recover database '/dm8restore database '/dm8/data/DAMENG/dm.ini' from backupset  '/dm8/backup/FULLBAK01';
#恢复
 recover database '/dm8/data/DAMENG/dm.ini' with archivedir '/dm8/arch';

故障模拟:MAIN.DBF丢失

#数据库备份
backup DATABASE full to FULLBAK01 BACKUPSET '/dm8/backup/FULLBAK01';
#MAIN.DBF丢失后模式、用户、角色等内容在manager中都查不到了
#还原数据库
restore database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup/FULLBAK01';
#恢复数据库
recover database '/dm8/data/DAMENG/dm.ini' from backupset '/dm8/backup/FULLBAK01';
#库级还原需要更新数据库魔数
recover database '/dm8/data/DAMENG/dm.ini' update db_magic;

添加外键约束:将非主键约束的列添加外键约束到主键列

假设此时TEST用户有两个表:
EMPLOYEE:

名字属性
EMPLOYEE_IDINTEGER
EMPLOYEE_NAMEVARCHAR(20)
DEPARTMENT_IDINTEGER
EMPLOYEE_SALARYINTEGER

其中EMPLOYEE_ID是该表的主键。
DEPARTMENT :

名字属性
DEPARTMENT_IDINTEGER
DEPARTMENT_NAMEVARCHAR(20)

其中DEPARTMENT_ID是该表的主键。
当想要为两个表添加外键约束时:
如果用如下语句:

alter table "TEST"."DEPARTMENT" add CONSTRAINT fk_employee_departmentid FOREIGN key("DEPARTMENT_ID") REFERENCES "TEST"."EMPLOYEE"("DEPARTMENT_ID");

在这里插入图片描述
由于DEPARTMENT_ID是DEPARTMENT表的主键,所以不能用DEPAERMENT的DEPARTMENT_ID向EMPLOYEE添加外键约束,只能反过来。

alter table "TEST"."EMPLOYEE" add CONSTRAINT fk_employee_departmentid FOREIGN key("DEPARTMENT_ID") REFERENCES "TEST"."DEPARTMENT"("DEPARTMENT_ID");

在这里插入图片描述

创建视图:包含group by

使用 GROUP BY 要注意以下问题:
1 在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列。
分组列的数据类型不能是多媒体数据类型;
2 分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;
3 当分组列值包含空值时,则空值作为一个独立组;
4 当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;
5 GROUP BY 子句中至多可包含 255 个分组列;
6 ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。

以上表为例,要建立一个部门员工工资总和的视图,显示部门编号和部门名称和部门工资总和:

create or replace view "TEST". "VIEW_DSA" as
select a.DEPARTMENT_ID ,a.DEPARTMENT_NAME , sum(b.EMPLOYEE_SALARY)
FROM "TEST"."DEPARTMENT" a ,"TEST"."EMPLOYEE" b
group by a. DEPARTMENT_ID;

当select中出现的表中原有的列没有出现在group by中会报错:
请添加图片描述
只有select和group by中的列相互对应才能编译通过:

create or replace view "TEST". "VIEW_DSA" as
select a.DEPARTMENT_ID ,a.DEPARTMENT_NAME , sum(b.EMPLOYEE_SALARY)
FROM "TEST"."DEPARTMENT" a ,"TEST"."EMPLOYEE" b
group by a. DEPARTMENT_ID,b.DEPARTMENT_NAME;

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值