#开启归档
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安装包放在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;
#数据库备份
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';
#数据库备份
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_ID | INTEGER |
EMPLOYEE_NAME | VARCHAR(20) |
DEPARTMENT_ID | INTEGER |
EMPLOYEE_SALARY | INTEGER |
其中EMPLOYEE_ID是该表的主键。
DEPARTMENT :
名字 | 属性 |
---|---|
DEPARTMENT_ID | INTEGER |
DEPARTMENT_NAME | VARCHAR(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 要注意以下问题:
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;