2012年12月2日日曜日

[工具使用] eclipse 中 web 项目相关设置杂项


1. 设置 web 项目部署到服务器时文件夹对应关系
Project 右键 -> Properties -> Deployment Assemble

2. 设置 web 项目可以被部署到服务器上
Project 右键 -> Properties -> Project Facets

3. 设置 web 项目 Contenxt Root
Project 右键 -> Properties -> Web Project Settings

4. 指定 tomcat 启动时 JVM 参数
菜单 -> run -> Debug/Run configurations -> Arguments

2012年11月29日木曜日

[LINUX 基础] X Window

1. 启动 X Window
# startx

2. 强制重启 X Window
[Ctrl] + [Alt] + [Back]

2012年11月18日日曜日

[Maven] 配置 Eclipse 调试 Maven Jetty 项目


1. 设置 Eclipse 的外部工具
进入 Menu/Run/External Tools/External Tools Configurations... 画面
右键左侧的 Program 选择 New 新建, 在相应输入框内输入如下内容, 设置后点击 Apply 保存

1-1. Main 选项卡

Location
--
C:\Program Files\maven304\bin\mvn.bat
--

Working Directory
--
${workspace_loc:/ssh-demo}
--

Arguments
--
jetty:run
--

1-2. Environment 选项卡

新建环境变量, 这里可以设置一些 JVM 启动变量
Name
--
MAVEN_OPTS
--
Value
--
-Dfile.encoding=UTF-8 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=y
--


2. 配置要调试的项目

右键项目新建 Debug As/Debug Configurations/Remote Java Application/New
确保 Port 指定的端口和 1 中指定的端口相同
选择 Allow termination of Remote VM, 点击 Apply 保存


3. 调试

3-1. 启动第一步配置的外部工具
Run/External Tools/External Tools Configurations/Run
此时 Eclipse 控制台会出现如下信息
--
Listening for transport dt_socket at address: 4000
--

3-2. 调试目标项目
右键项目选择 Debug As/Debug Configurations/Remote Java Application, 点击 Debug 按钮
设置断点, 通过 http://localhost:8080 访问

2012年11月14日水曜日

[LINUX 基础] rsync

1. 查看变更过的文件
rsync -avn srcdir destdir

2. 备份差分, 未变更的文件做硬链接以减少磁盘消耗
rsync -av --link-dest=/old_destdir srcdir destdir

3. 列举没有硬链接的文件
find /backup -links 1 -print

2012年11月6日火曜日

[Maven] maven3.x 的基本用法

1. 设置代理
vi /path/to/maven3/conf/setting.xml
--
<proxies>
  <proxy>
    <id>optional</id>
    <active>true</active>
    <protocol>http</protocol>
    <username></username>
    <password></password>
    <host>www.proxy.com</host>
    <port>80</port>
    <nonProxyHosts>localhost</nonProxyHosts>
  </proxy>
</proxies>


2. 设置 JVM 参数

2-1. mvn 全局设置
edit C:\Program Files\maven304\bin\mvn.bat
--
- @REM set MAVEN_OPTS=-Xdebug -Xnoagent...
+ set MAVEN_OPTS=-Dfile.encoding=UTF-8...
--

2-1. 单独设置 (jetty)
edit pom.xml
--
<plugin>
  <groupId>org.mortbay.jetty</groupId>
  ...
  <configuration>
  <!-- set jvm args when jetty:run-forked -->
  <jvmArgs>-Dfile.encoding=UTF-8</jvmArgs>
  ...
  </configuration>
</plugin>
--

2012年10月14日日曜日

[分区表] 分区表基本操作


# 分区表与分区索引相关视图
dba_part_tables
dba_tab_partitions
dba_tab_subpartitions
dba_part_key_columns
dba_subpart_key_columns
dba_part_indexes
dba_ind_partitions


1. 查询所有有分区的表
select * from dba_tables where partitioned = 'YES'


2. 查询表分区
select * from dba_tab_partitions where table_name = 'T'


3. 指定分区查询
select * from t partition (p1)


4. 增加一个分区

4-1. 增加列表分区
alter table t add partition p3 values (3);

4-2. 增加散列分区
alter table t add partition p3;

4-3. 增加范围分区
alter table t add partition p3
values less than (to_date('2012-05-01','yyyy-MM-dd'))

4-4. 增加组合分区
alter table t add partition p4
values less than(to_date('2012-05-01','yyyy-MM-dd'))
(
    subpartition p4_subp1 values('value1'),
    subpartition p4_subp2 values('value2')
)

4-5. 存在 default 分区存在时, 增加新分区的方法

4-5-1. 备份 default 分区数据
create table t_temp as select * from t where 1 = 0
alter table t exchange partition p0 with table t_temp

4-5-2. 删除 default 分区
alter table t drop partition p0

4-5-3. 增加新分区和 default 分区
alter table t add partition p4 values (4)
alter table t add partition pn values (default)

4-5-4. 恢复 default 分区数据
-- alter table t exchange partition p0 with table t_temp
insert into t select * from t_temp

4-5-5. 删除备份表
drop table t_temp purge


5. 增加子分区, 只能是散列或列表子分区
alter table t modify partition p1 add subpartition p11 values (x)


6. 增加一个 default 分区
alter table t add partition pn values (default)
alter table t add partition pn values less than (maxvalue)


7. 分区重命名
# 对全局, 局部索引无影响
alter table t rename partition p3 to p4
alter index t_idx rename partition p3 to p4


8. 删除一个表分区
alter table t drop partition p1


9. 删除子分区
alter table t drop subpartition p11


10. 截断分区

10-1. 对索引的影响
alter table t truncate partition p1 [update indexes];
# 截断分区会自动维护局部索引
# 如果不加 update indexes, 可能会使全局索引失效, 需要全局重建索引
select partition_name,status from dba_ind_partitions where index_owner='T_IDX';
alter index t_idx rebuild partition p1 [online];

10-2. 截断带有约束的分区表
# 禁用约束
alter table t disable constraint const1

# 截断分区
alter table t truncate partitoin p1 [update indexes]

# 启用约束
alter table t enable constraint const1


11. 截断子分区
alter table t truncate subpartition p11


12. 合并分区
# 合并后的分区名, 不能是边界值较低的那个
# 合并前边界值较小分区在前, 大的在后
# 只能合并相邻分区
# 全局索引失效, 所涉及的局部索引失效
# 若加 update indexes 子句, 全局局部索引均不失效
alter table t merge partitions p1, p2 into partition p2


13. 拆分分区
# 散列分区不可拆分
# 全局索引失效, 所涉及的局部索引失效
# 若加 update indexes 子句, 全局局部索引均不失效

13-1. 拆分范围分区
# 2003-01-01 为分界点, p21 < p22
alter table t split partition p2 at (to_date('2003-01-01','YYYY-MM-DD')) into (partition p21,partition p22)

13-2. 拆分列表分区
# 拆分后, 4 的记录分入 p4 分区, 其余分入 p5 分区
alter table t split partition pn values(4) into (partition p4,partition p5);

14. 分区移动表空间

14-1. 查看分区在哪个表空间
select table_name, partition_name, tablespace_name, subpartition_count
from dba_tab_partitions where table_owner='GO';

14-2. 移动分区
# 若不加 update indexes 子句, 全局和所在区的局部索引均失效
alter table t move partiton p1 tablespace tbs1 [update indexes];

14-3. 检查是否移动成功
select table_name, partition_name, tablespace_name, subpartition_count
from dba_tab_partitions where table_owner='GO';

14-4. 移动表空间后要重建索引, 否则索引会变得无效
alter index t_idx rebuild


15. 接合分区, 只适用于散列分区
alter table t coalesca partition

2012年9月23日日曜日

[数据迁移] 用户管理的热备份方式复制数据库


1. 创建实例, 密码文件, 初始化参数文件, 以及目标库相应目录
> oradim -new -sid dup
> orapwd file=pwddup password=xxxxxx
> mkdir %ORACLE_BASE%\admin\dup
> mkdir %ORACLE_BASE%\admin\dup\adump
> mkdir %ORACLE_BASE%\admin\dup\bdump
> mkdir %ORACLE_BASE%\admin\dup\cdump
> mkdir %ORACLE_BASE%\admin\dup\udump


2. 在源库开始热备份, 并复制数据文件到目标库目录
GO> alter database begin backup;


3. 源库停止热备份
GO> alter database end backup;


4. 归档源库当前日志, 并拷贝到目标库归档目录
GO> select * from v$log;
    GROUP# SEQUENCE# ARC STATUS  
---------- --------- --- --------
         1        10 YES ACTIVE  
         2        11 NO  CURRENT 
         3         9 YES INACTIVE

GO> alter system archive log current;


5. 将目标库启动到 nomount 状态, 并创建控制文件
DUP> startup nomount

=================================
CREATE CONTROLFILE REUSE SET DATABASE "DUP" RESETLOGS FORCE LOGGING ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'D:\DATA\ORACLE10GR2\DUP\REDO01.LOG'  SIZE 50M,
  GROUP 2 'D:\DATA\ORACLE10GR2\DUP\REDO02.LOG'  SIZE 50M,
  GROUP 3 'D:\DATA\ORACLE10GR2\DUP\REDO03.LOG'  SIZE 50M
-- STANDBY LOGFILE
DATAFILE
  'D:\DATA\ORACLE10GR2\DUP\SYSTEM01.DBF',
  'D:\DATA\ORACLE10GR2\DUP\UNDOTBS01.DBF',
  'D:\DATA\ORACLE10GR2\DUP\SYSAUX01.DBF',
  'D:\DATA\ORACLE10GR2\DUP\USERS01.DBF'
CHARACTER SET AL32UTF8
;
=================================


6. 对目标库做介质恢复
DUP> recover database using backup controlfile until cancel;

ORA-00279: change 2521364 generated at 09/23/2012 16:04:19 needed for thread 1
ORA-00289: suggestion : D:\DATA\ORACLE10GR2\FLASH_RECOVERY_AREA\DUP\ARCHIVELOG\2012_09_23\O1_MF_1_10_%U_.ARC
ORA-00280: change 2521364 for thread 1 is in sequence #10

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\DATA\ORACLE10GR2\FLASH_RECOVERY_AREA\DUP\ARCHIVELOG\2012_09_23\O1_MF_1_10_85XF6VRV_.ARC
...

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
D:\DATA\ORACLE10GR2\FLASH_RECOVERY_AREA\DUP\ARCHIVELOG\2012_09_23\O1_MF_1_11_85XF9846_.ARC
...

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.


7. 以 resetlogs 方式打开目标库
DUP> alter database open resetlogs;


8. 添加临时文件到目标库
DUP> alter tablespace temp add tempfile 'D:\Data\oracle10gr2\dup\temp01.dbf' size 5m reuse;
DUP> select file#,name from v$tempfile;
     FILE# NAME
---------- ----------------------------------------
         1 D:\DATA\ORACLE10GR2\DUP\TEMP01.DBF


9. 修改目标库 dbid
DUP> select dbid,name from v$database;
      DBID NAME
---------- ----------------------------------------
1002322791 DUP

DUP> shutdown immediate
DUP> startup mount

> nid target=sys/oracle

DBNEWID: Release 10.2.0.5.0 - Production on Sun Sep 23 16:32:51 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Connected to database DUP (DBID=1002322791)

Connected to server version 10.2.0

Control Files in database:
    D:\DATA\ORACLE10GR2\DUP\CONTROL01.CTL
    D:\DATA\ORACLE10GR2\DUP\CONTROL02.CTL
    D:\DATA\ORACLE10GR2\DUP\CONTROL03.CTL

Change database ID of database DUP? (Y/[N]) => y

Proceeding with operation
Changing database ID from 1002322791 to 165619252
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL01.CTL - modified
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL02.CTL - modified
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL03.CTL - modified
    Datafile D:\DATA\ORACLE10GR2\DUP\SYSTEM01.DBF - dbid changed
    Datafile D:\DATA\ORACLE10GR2\DUP\UNDOTBS01.DBF - dbid changed
    Datafile D:\DATA\ORACLE10GR2\DUP\SYSAUX01.DBF - dbid changed
    Datafile D:\DATA\ORACLE10GR2\DUP\USERS01.DBF - dbid changed
    Datafile D:\DATA\ORACLE10GR2\DUP\TEMP01.DBF - dbid changed
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL01.CTL - dbid changed
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL02.CTL - dbid changed
    Control File D:\DATA\ORACLE10GR2\DUP\CONTROL03.CTL - dbid changed
    Instance shut down

Database ID for database DUP changed to 165619252.
All previous backups and archived redo logs for this database are unusable.
Database is not aware of previous backups and archived logs in Recovery Area.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database ID.
DBNEWID - Completed succesfully.


DUP> startup mount
DUP> alter database open resetlogs;
DUP> select dbid,name from v$database;
      DBID NAME
---------- ----
 165619252 DUP

2012年9月8日土曜日

[备份恢复] MHVTL 虚拟带库

1. 操作命令
mt -f /dev/nst0 compression 1 # 压缩 ON = default
mt -f /dev/nst0 compression 0 # 不压缩
mt -f /dev/nst0 tell # 当前指针位置
mt -f /dev/nst0 fsf # 将指针移动到下个文件的开头 block
mt -f /dev/nst0 fsf n # 将指针移动到下 n 文件的开头 block
mt -f /dev/nst0 bsf # 将指针移动到前个文件的开头 block
mt -f /dev/nst0 bsf n # 将指针移动到前 n 文件的开头 block
mt -f /dev/nst0 erase # 删除磁带上的数据, 需要在 rewind 之后执行
mt -f /dev/nst0 retension # 重新卷一遍磁带, 松弛?
mt -f /dev/nst0 rewind # 指向磁带开头
mt -f /dev/nst0 offline 指向磁带开头并弹出

$ export TAPE=/dev/nst0
$ ln -s /dev/nst0 /dev/tape
# 此后的 mt 操作可以省略 /dev/nst0
# tar 操作直接指定 /dev/tape

tar tvf /dev/nst0
# 读取磁带当前位置指针所指向的文件
# 读取后指针指向此文件的最后一个 block, 而并不是下一个文件的第一个 block
# 要继续读取下个 文件, 需要 fsf 移动指针

mt -f /dev/nst0 fsf
# 将指针指向下一个文件的第一个 block

# mt -f /dev/nst0 status
File number=1, block number=1025, partition=0.
# tar tvf /dev/nst0 后显示磁带的状态
# 此时指针指向当前文件的末尾
# 当前文件是第 number + 1 个文件, 此文件包含 1025 个 block

2012年9月3日月曜日

[SQL学习] 数字/时间处理函数

1. 保留指定小数位, 四舍五入
select round(1.4) from dual; # 1
select round(1.5) from dual; # 2
select round(1.2345, 3) from dual; # 1.235

2. 保留指定小数位, 截取
select trunc(1.4) from dual; # 1
select trunc(1.5) from dual; # 1
select trunc(1.2399, 2) from dual; # 1.23

3. 取整数, 小数位置有值则进位
select ceil(1) from dual; # 1
select ceil(1.0001) from dual; # 2

4. 取整数, 舍去小数位
select floor(1.4) from dual; # 1
select floor(1.9) from dual; # 1

5. 按照指定数字格式格式化数字, 四舍五入
# 9 补空格, 0 补 0
select to_char(123.4567,'99') from dual; # ## 整数位不足无法显示
select to_char(123.4567,'999') from dual; # 123
select to_char(123.4567,'999.9') from dual; # 123.5
select to_char(123.4567,'999.99') from dual; # 123.46
select to_char(123456.789,'999,999') from dual; # 123,457
select to_char(123.456,'9999.999') from dual; # (空格)123,457
select to_char(123.456,'9999.999') from dual; # (空格)123,457
select to_char(123.456,'0000.999') from dual; # 0123.456
select to_char(123.456,'999.9999') from dual; # 123.4560
select to_char(123.456,'999.0000') from dual; # 123.4560
select to_char(123.456,'999.9990') from dual; # 123.4560
select to_char(123.456,'$999.999') from dual; # $123.456
select to_char(8,'000') from dual; # (符号位空格)008
select to_char(8,'s000') from dual; # +008
select to_char(-8,'000') from dual; # -008
select to_char(8,'fm000') from dual; # 008, 去掉开头符号位空格

6. to_char函数特殊用法
to_char(sysdate,'d') # 每周第几天, 周日 = 1
to_char(sysdate,'dd') # 每月第几天
to_char(sysdate,'ddd') # 每年第几天
to_char(sysdate,'w') # 每月第几周
to_char(sysdate,'ww') # 每年第几周
to_char(sysdate,'mm') # 每年第几月
to_char(sysdate,'q') # 每年第几季
to_char(sysdate,'yy') # 年
to_char(sysdate,'yyyy') # 年

2012年9月1日土曜日

[基础知识] 重做日志相关操作

1. 添加 redo 日志组
alter database add logfile group 1 ('/data/redo02.log','/data/redo02.log') size 5m;

2. 添加 redo 日志文件到组
alter database add logfile member ('/data/redo01.log','/data/redo02.log') to group 1;

3. redo 日志成员重命名
shutdown immediate
startup mount
cp /old/data/redo01.log /new/data/redo01.log
alter database rename file '/old/data/redo01.log' to '/new/data/redo01.log';
alter database open;

4. 调整日志文件大小
将待调整的日志文件组置为 inactive,必要时候 alter system chekopoint;
alter system switch logfile;
alter database drop logfile gorup 1;
alter database add logfile group 1 ('/data/redo01.log','/data/redo02.log') size 10m reuse;
alter system switch logfile;

5. 归档 redo 日志
alter system archive log current;
alter system archive log all;

6. 清除已归档的日志组
alter database clear logfile group 1;

7. 清除未归档的日志组
alter database clear unarchived logfile group 1;

8. 相关视图
select * from v$log;
select * from v$logfile;
select * from v$log_history; -- 控制文件中日志的历史信息, 切换的时间应该尽可能的不低于 10-20 分钟
select * from v$archived_log; -- 从控制文件中获得归档的相关信息
select * from v$archive_dest; -- 归档路径及状态
select * from v$database; -- 查看数据库是否处于归档状态
select * from v$archive_processes; -- 归档相关的后台进程信息
select * from v$sgainfo where name in ('Fixed SGA Size','Redo Buffers','Granule Size'); -- 'Fixed SGA Size'+ 'Redo Buffers'是 granule size 的整数倍

9. 修改/查看 redo 归档/非归档模式
alter database archivelog
alter database noarchivelog
archive log list
SELECT log_mode FROM v$database

10. 设置归档日志参数
alter system set log_archive_max_processes=3;
alter system set log_archive_dest = '/u01/app/oracle/archivelog1' scope = spfile;
alter system set log_archive_duplex_dest = '/u01/app/oracle/archivelog2' scope = spfile;
alter system set log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog3';
alter system set log_archive_dest_2 = 'SERVICE=standby1';
alter system set log_archive_format = 'arch_%t_%s_%r.arc';

11. LGWR触发条件
11-1. 用户提交
11-2. 有 1/3 重做日志缓冲区未被写入磁盘
11-3. 有大于 1M 的重做日志缓冲区未被写入磁盘
11-4. 每隔 3 秒钟
11-5. DBWR 需要写入的数据的 SCN 大于 LGWR 记录的 SCN, DBWR 触发 LGWR 写入


[备份恢复] 归档模式无备份时恢复丢失的数据文件

# system 表空间数据文件无法恢复
# 临时表空间无需恢复
# 没有备份, 只要存在归档和重做日志, 也可以恢复

SQL> startup mount;
SQL> alter database create datafile 5 as '/data/users01.dbf';
SQL> alter database create datafile '/data/users01.dbf' as '/data/users01.dbf';
SQL> recover datafile 5;
SQL> alter database open;

RMAN> startup mount;
RMAN> restore datafile 5;
RMAN> recover datafile 5;
RMAN> alter database open;

[备份恢复] RMAN 各种文件的恢复方法

1. 完全介质恢复
# 数据库需要在 mount 状态

1-1. 挂载数据库
RMAN> startup mount;

1-2. 执行恢复
RMAN> restore database;
# delete archivelog 会删除恢复期间产生的归档, 不影响之前的归档
# maxsize 指定恢复过程中产生归档的上限大小, 达到上限会自行删除
RMAN> recover database delete archivelog maxsize 10m skip tablespace temp;
RMAN> alter database open;


2. 恢复表空间或数据文件

2-1. 表空间
# 数据库可以在 mount 也可以在 open 状态
RMAN> sql 'alter tablespace users offline';
RMAN> restore tablespace users;
RMAN> recover tablespace users;
RMAN> sql 'alter tablespace users online';

2-2. 数据文件
# 数据库可以在 mount 也可以在 open 状态
RMAN> sql 'alter datafile 5 offline';
RMAN> restore datafile 5;
RMAN> recover datafile 5;
RMAN> sql 'alter datafile 5 online';

RMAN> sql 'alter datafile 5 offline';
RMAN> run {
set newname for datafile 5 to '/data/users01.dbf';
restore datafile 5;
switch datafile 5;
recover datafile 5;
}
RMAN> sql 'alter tablespace users online';

2-2. 归档日志
# 恢复数据文件时, RMAN 会自动恢复并应用归档日志, 一般情况不需要手动恢复
# 默认恢复到 log_archive_dest_1 下
RMAN> restore archivelog sequence 22
RMAN> restore archivelog sequence between 22 and 23;

# 恢复到其他路径
RMAN> run {
set archivelog destination to '/arch1';
restore archivelog sequence between 21 and 22;
set archivelog destination to '/arch1';
restore archivelog sequence between 23 and 24;
}


3. 恢复控制文件

3-1. 从自动备份中恢复
RMAN> set dbif=xxxxxxxxx;
RMAN> startup nomount;

# 恢复控制文件到 control_files 路径下
RMAN> restore controlfile from autobackup;
# 恢复控制文件到任意路径下
RMAN> restore controlfile to '/data/control01.ctl' from autobackup;
# 若之前修改过自动备份的路径, 则恢复前需要手动设置自动备份路径
RMAN> set controlfile autoback format for device type disk to '/data/%F';
RMAN> restore controlfile from autobackup;

3-2. 从备份集中恢复
RMAN> set dbif=xxxxxxxxx;
RMAN> startup nomount;
RMAN> restore controlfile from '/data/xxxxxxxxxxxxxxxxxxxxx';
RMAN> recover database;
RMAN> alter database open resetlogs;


4. 初始化参数文件
RMAN> set dbif=xxxxxxxxx;
RMAN> startup nomount;
RMAN> restore spfile from autobackup;
RMAN> restore spfile to '/data/xxxxxx' from autobackup;
RMAN> restore spfile to '/data/xxxxxx' from '/back/xxxxxx';

[备份恢复] RMAN 增量备份

1. 增量备份
# RMAN 支持 0-4 级备份, 必须将 0 级备份作为增量策略的基础备份
# 0 级增量备份在内容上与完全备份相同, 但与完全备份不同的是, 0 级备份被看作是增量策略的一部分
# 如果在运行 1 级或更高级别的备份时, 0 级备份不存在, RMAN 会自动创建 0 级备份

2. 类型

2-1. 差异增量备份 (differential)
增量备份的缺省类型, 备份自最近 n 级或更低级别备份以来更改过的所有块

2-2. 累积增量备份 (cumulative)
备份自最近 n-1 级或更低级别备份以来更改过的所有块

3. 命令示例
backup incremental level=0 [cumulative] database
backup incremental level=0 tablespace users
backup incremental level=0 datafile 4
backup incremental level=0 current controlfile
backup incremental level=0 spfile



2012年8月30日木曜日

[备份恢复] RMAN 配置

1. 重置配置
configure retention policy clear;

2. 备份策略
# 每个文件的备份需要保留天数或份数
configure retention policy to recovery window of n days;
configure retention policy to redundancy n;
configure retention policy to none;

3. 备份优化
configure backup optimization on;
configure backup optimization off;

4. IO 设备类型
configure default device type to disk;
configure default device type to sbt;
configure device type disk parallelism 2 backup type to backupset;

5. 控制文件自动备份
configure controlfile autobackup on;
configure controlfile autobackup off;
configure controlfile autobackup format for device type disk to '%F';
configure snapshot controlfile name to '/tmp/snapcf_fsdb.f'

6. 备份冗余
configure datafile backup copies for device type disk to 2;
configure archivelog backup copies for device type disk to 2;

7. 备份集大小
configure maxsetsize to unlimited;
configure maxsetsize to 100M;

8. 备份加密
configure encryption for database on;
configure encryption for tablespace users on;
configure encryption algorithm 'aes128';

9. 删除归档
configure archivelog deletion policy to none;
configure archivelog deletion policy to applied on standby;

[安装配置] Linux 卸载 Oracle10G

1. $ORACLE_HOME/bin/localconfig delete
2. rm -rf $ORACLE_BASE/*
3. rm -f /etc/oraInst.loc /etc/oratab
4. rm -rf /etc/oracle
5. rm -f /etc/inittab.cssd
6. rm -f /usr/local/bin/coraenv /usr/local/bin/dbhome /usr/local/bin/oraenv
7. userdel oracle; groupdel dba; groupdel oinstall
8. 删除数据文件, 环境变量设置

2012年8月24日金曜日

[备份恢复] 同时丢失控制文件与数据文件的恢复

1. 准备工作
1-1. 备份控制文件, 需要在创建表空间之前备份
SQL> alter database backup controlfile to '/tmp/control01.ctl';

1-2. 创建测试表空间
SQL> create tablespace tbs datafile '/data/asmdb/tbs01.dbf' size 5m;

1-3. 删除控制文件与测试数据文件


2. 恢复

2-1. 复制回备份控制文件, 并启动到 mount
SQL> startup mount

2-2. 利用 redo 恢复控制文件到最新
# 恢复后, 控制文件就有了删除丢失的数据文件的信息

SQL> recover database using backup controlfile;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/asmdb/redo01.log
ORA-00283: recovery session canceled due to errors
ORA-01244: unnamed datafile(s) added to control file by media recovery
ORA-01110: data file 5: '/data/asmdb/tbs01.dbf'
ORA-01112: media recovery not started

SQL> select * from v$tablespace;
       TS# NAME   INC BIG FLA ENC
---------- ------ --- --- --- ---
         7 TBS    YES NO  YES

SQL> select name from v$datafile;

NAME
--------------------------------------------
/oracle/product/10.2.0/db_1/dbs/UNNAMED00005

2-3. 手动创建丢失的数据文件, 并再次执行恢复
SQL> alter database create datafile 5 as '/data/asmdb/tbs01.dbf' size 5m;

SQL> recover database using backup controlfile;
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/asmdb/redo01.log
Log applied.
Media recovery complete.

2-4. resetlogs 打开数据库, 查看恢复结果
SQL> alter database open resetlogs;

Database altered.

SQL> select * from tt;

        ID
----------
         1

2012年8月21日火曜日

[数据迁移] 数据库从文件系统迁移到 ASM 存储

前提条件: 磁盘组 DG1 DG2 均以创建并挂载

1. 确认所要迁移的文件
SQL>
select name from v$controlfile
union all
select name from v$datafile
union all
select name from v$tempfile
union all
select member from v$logfile
union all
select value from v$parameter where name = 'spfile';


2. 修改参数文件

2-1. control_files
SQL> alter system set control_files='+DG1' scope=spfile;

2-2. db_create_file_dest
SQL> alter system set db_create_file_dest='+DG1';

2-3. db_recovery_file_dest
SQL> alter system set db_recovery_file_dest='+DG2';


3. 迁移文件

3-1. 参数文件
SQL> create pfile from spfile;
SQL> create spfile='+DG1/asmdb/spfileasmdb.ora' from pfile;
SQL> shutdown immediate
$ mv initasmdb.ora initasmdb.ora.bak
$ cp initasmdb.ora.bak initasmdb.ora
$ vim initasmdb.ora
spfile='+DG1/asmdb/spfileasmdb.ora'

3-2. 控制文件
$ rman target /
RMAN> startup nomount
RMAN> restore controlfile from '/data/control01.ctl';
RMAN> alter database mount;

3-3. 数据文件
RMAN> backup as copy database format '+DG1';

RMAN> switch database to copy;
RMAN> recover database;
RMAN> alter database open;

3-4. 临时文件
SQL> select name,status,enabled from v$tempfile;
SQL> alter tablespace temp add tempfile '+DG1';
SQL> alter tablespace temp drop tempfile '/data/temp01.dbf';

3-5. 日志文件
SQL> alter database add logfile member '+DG1' to group 1;
SQL> alter database add logfile member '+DG1' to group 2;
SQL> alter database add logfile member '+DG1' to group 3;
SQL> alter system switch logfile;
SQL> alter database drop logfile member '/data/asmdb/redo01.log';
SQL> alter database drop logfile member '/data/asmdb/redo02.log';
SQL> alter database drop logfile member '/data/asmdb/redo03.log';


4. 查看迁移结果
SQL> shutdown immediate
SQL> startup
SQL>
select name from v$datafile
union all
select name from v$tempfile
union all
select name from v$controlfile
union all
select member from v$logfile;
union all
select value from v$parameter where name = 'spfile';

2012年8月20日月曜日

[数据迁移] 数据库从 ASM 存储迁移到文件系统

1. 确认所要修改的文件的位置
SQL>
select name from v$controlfile
union all
select name from v$datafile
union all
select name from v$tempfile
union all
select member from v$logfile
union all
select value from v$parameter where name = 'spfile';


2. 修改参数文件

2-1. control_files
SQL> alter system set control_files='/data/control01.ctl' scope=spfile;

2-1. db_create_file_dest
SQL> alter system set db_create_file_dest='';

2-2. db_recovery_file_dest
SQL> alter system set db_recovery_file_dest='/backup';

2-3. db_create_online_log_dest


3. 迁移

3-1. 参数文件
SQL> create pfile from spfile;
SQL> create spfile from pfile;

3-2. 拷贝控制文件
$ rman target /
RMAN> startup nomount
RMAN> restore controlfile from '+DG1/asmdb/controlfile/current.256.791556801';

3-3. 数据文件
RMAN> copy datafile '+DG1/asmdb/datafile/system.260.791556937' to '/data/system01.dbf';
RMAN> copy datafile '+DG1/asmdb/datafile/undotbs1.261.791556989' to '/data/undotbs01.dbf';
RMAN> copy datafile '+DG1/asmdb/datafile/sysaux.262.791556993' to '/data/sysaux01.dbf';
RMAN> copy datafile '+DG1/asmdb/datafile/users.264.791557029' to '/data/users01.dbf';

RMAN> alter database mount;
RMAN> switch database to copy;
RMAN> recover database;
RMAN> alter database open;

3-4. 临时文件
SQL> create temporary tablespace temp tempfile '/data/temp01.dbf' size 20m;
SQL> alter tablespace temp drop tempfile '+DG1/asmdb/datafile/temp.260.791556937';

3-5. 日志文件
SQL> select member from v$logfile;
SQL> alter database add logfile member '/data/redo01.log' to group 1;
SQL> alter database add logfile member '/data/redo02.log' to group 2;
SQL> alter database add logfile member '/data/redo03.log' to group 3;
SQL> alter database drop logfile member '+DG1/asmdb/onlinelog/group_1.257.791556811';
SQL> alter database drop logfile member '+DG1/asmdb/onlinelog/group_2.258.791556849';
SQL> alter database drop logfile member '+DG1/asmdb/onlinelog/group_3.259.791556889';

4. 查看迁移结果
SQL> shutdown immediate
SQL> startup
SQL>
select name from v$datafile
union all
select name from v$tempfile
union all
select name from v$controlfile
union all
select member from v$logfile
union all
select value from v$parameter where name = 'spfile';

2012年8月18日土曜日

[ASM] 单机环境配置 ASM 实例


1. 创建 CSS 服务

1-1. 添加 CSS 服务并启动
# /oracle/product/10.2.0/db_1/bin/localconfig add

1-2. 如果不能自动启动, 手动启动
# /etc/init.d/init.cssd run &
# /oracle/product/10.2.0/db_1/bin/crsctl start crs

1-3. 查看 CSS 是否已启动
# /oracle/product/10.2.0/db_1/bin/crsctl check crs
# ps auxwww|grep css


2. ASM 磁盘文件

2-1. 创建磁盘文件并挂载
# dd if=/dev/zero of=/data/asmdisks/asm01 bs=1k count=1000000
# losetup /dev/loop1 /data/asmdisks/asm01; sleep 2
# raw /dev/raw/raw1 /dev/loop1; sleep 2
# chown oracle:dba /dev/raw/raw1
# chmod 660 /dev/raw/raw1

2-2. 设置系统启动时自动挂载磁盘文件
# cat /etc/init.d/dbora
--
#!/bin/sh
#chkconfig: 2345 99 01

losetup /dev/loop1 /data/asmdisks/asm01; sleep 2

raw /dev/raw/raw1 /dev/loop1; sleep 2

chown oracle:dba /dev/raw/raw1

chmod 660 /dev/raw/raw1
--

3. 创建 ASM 实例
# dbca

[ASM] ASM 相关操作


1. asm 相关初始化参数

1-1. parameter db_unique_name, 可通过 alter 命令修改
> show parameter db_unique_name
name           type   value
-------------- ------ -----
db_unique_name string +asm

1-2. instance_type
> show parameter instance_type
name          type   value
------------- ------ -----
instance_type string asm

1-3. asm_power_limit, 1 - 11, 默认是 1, 指定 rebalance 消耗资源等级
> show parameter asm_power_limit
name            type    value
--------------- ------- -----
asm_power_limit integer 1

1-4. asm_diskgroups, asm 启动时或 all mount 时自动挂载的磁盘组
> show parameter asm_diskgroups
name           type   value
-------------- ------ --------
asm_diskgroups string dg2, dg1

> alter system set asm_diskgroups='' sid='*';
> alter system set asm_diskgroups=dg1,dg2,dg3 sid='*';

1-5. asm_diskstring, 默认是 null, 所有 asm 拥有读写权限的磁盘
> show parameter asm_diskstring
name           type   value
-------------- ------ -------------
asm_diskstring string /dev/raw/raw*

1-6. db_create_file_dest
# 对于数据库实例 (类型是 RDBMS) 有效
# 指定 OMF 自动创建文件名的磁盘组, 创建是可以不指定磁盘组

> alter system set db_create_file_dest='DG1';

2. asm 相关操作
export oracle_sid=+asm
sqlplus / as sysdba

2-1. 创建磁盘组, force 可以将磁盘从其他组移动到这一组
create diskgroup dg1 normal redundancy
  failgroup fg1 disk
    '/dev/raw/raw1' name disk01,
    '/dev/raw/raw2' name disk02
  failgroup fg2 disk
    '/dev/raw/raw3' name disk03,
    '/dev/raw/raw4' name disk04;

create diskgroup dg2 external redundancy disk '/dev/raw/raw5','/dev/raw/raw6';

2-2. 删除磁盘组
drop diskgroup dg1 including contents;

2-3. 增加/删除磁盘
alter diskgroup dg1 add disk '/asmdisks/asm*1', '/asmdisks/asm*2';
alter diskgroup dg1 add disk '/asmdisks/asm[123]' rebalance wait;
alter diskgroup dg1 drop disk disk01 rebalance wait;
alter diskgroup dg1 undrop disks;

2-4. 改变磁盘大小
alter diskgroup dg1 resize disk disk01 size 100g;
alter diskgroup dg1 resize disks in failgroup fg1 size 100g;
alter diskgroup dg1 resize all size 100g;

2-5. rebalance 磁盘组
alter diskgroup dg1 rebalance power 5 [wait];

2-6. 查看后台正在进行的操作
select * from v$asm_operation;

2-7. 挂载/卸载磁盘组
alter diskgroup all dismount;
alter diskgroup all mount;
alter diskgroup dg1 dismount;
alter diskgroup dg1 mount;

2-8. 创建/修改/删除模板
alter diskgroup dg1 add template template1 attributes (mirror fine);
alter diskgroup dg1 alter template template1 attributes (coarse);
alter diskgroup dg1 drop template template1;

unprotected 
mirror 
coarse 
fine 

2-9. 创建/重命名/删除目录
alter diskgroup dg1 add directory '+dg1/dir1';
alter diskgroup dg1 rename directory '+dg1/dir1' to '+dg1/dir_2';
alter diskgroup dg1 drop directory '+dg1/dir_2' force;

2-10. 创建/重命名/删除别名
alter diskgroup dg1 add alias '+dg1/dir/file.dbf' for '+dg1/asmdb/datafile/ts.342.3';
alter diskgroup dg1 add alias '+dg1/dir/file.dbf' for '+dg1.342.3';
alter diskgroup dg1 rename alias '+dg1/dir/file.dbf' to '+dg1/dir/file2.dbf';
alter diskgroup dg1 delete alias '+dg1/dir/file.dbf';

2-11. 删除文件
alter diskgroup dg1 drop file '+dg1/dir/file.dbf';
alter diskgroup dg1 drop file '+dg1.342.3';
alter diskgroup dg1 drop file '+dg1/asmdb/datafile/ts.342.3';

2-12. 检查元数据
alter diskgroup dg1 check file '+dg1/dir/file.dbf'
alter diskgroup disk_group_1 check failgroup failure_group_1;
alter diskgroup dg1 check disk disk01;
alter diskgroup dg1 check all;

3. 相关视图
select * from dict where table_name like 'V$ASM_%';