测试incremental backup时间

September 24th, 2009

incremental backup在没有打开block change tracking的情况下将扫描所有数据文件,将指定SCN号后有change的block写入备份文件中。

当physical standby数据库落后primary database并且archive log丢失的情况下可用于恢复standby数据库。

简单步骤如下:

1. 查看目前standby数据库recover到了哪个SCN

standby> alter database recover managed standby database cancel;

standby> select current_scn from v$database;

2. 在primary数据库上做incremental backup

prmary> rman target /
primary> backup incremental from scn xxxx database format ‘/dir/ForStandby_%U’ tag ‘FOR STANDBY’;

3. 将备份的文件copy到standby数据库

4. 在primary上生成standby controlfile,并将其copy到standby database

primary> alter database create standby controlfile as ‘/tmp/stby.ctl’;

5. shutdown standby database,使用新的control file startup,如果有文件名不同,需要rename datafile
如果有新文件在standby apply后生成的,需要create datafile

SQL> alter database create datafile as ‘‘;

6. 在standby上面应用incremental backup set

RMAN> CATALOG START WITH ‘/tmp/ForStandby’;

RMAN> RECOVER DATABASE NOREDO;

我在一3.6TB的数据库上(存储为HDS 9990)大略测试了下incremental backup的时间:

SQL> select sum(bytes)/power(1024,4)|| from v$datafile;

SUM(BYTES)/POWER(1024,4)
————————
3.640852

1. noparallel

RMAN> BACKUP INCREMENTAL FROM SCN 3561046270000 database format ‘/backup/ForStandby_%U’ tag ‘FOR STANDBY’;

Starting backup at 2009-09-18 08:40:22
Finished backup at 2009-09-18 14:25:54

– 5 hour 54 minutes

2. parallel 4

run
{
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate channel ch3 type disk;
allocate channel ch4 type disk;
BACKUP INCREMENTAL FROM SCN 3561046383893 database format ‘/backup/ForStandby2nd_%U’ tag ‘FOR STANDBY’;
}

Starting backup at 2009-09-21 23:38:57
Finished backup at 2009-09-22 03:04:39

– 3 hour 26 minutes

3. prallel 8

run
{
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate channel ch3 type disk;
allocate channel ch4 type disk;
allocate channel ch5 type disk;
allocate channel ch6 type disk;
allocate channel ch7 type disk;
allocate channel ch8 type disk;
BACKUP INCREMENTAL FROM SCN 3561046369814 database format ‘/oracle/CATY12/archive/CATY12/ForStandby3nd_%U’ tag ‘FOR STANDBY’;
}

Starting backup at 2009-09-22 03:23:14
Finished backup at 2009-09-22 06:38:11
– 3 hour 15 minutes

这里没有多个备份目录,可能影响了一些性能。记录一下,以后可能有参考价值。

Eagle Fan oracle

安装BBED

September 17th, 2009

BBED全称oracle block brower and editor tool,可以用来更改数据block。

在有些场合很有用,不过不被官方support。玩玩无妨:)

安装过程如下:

cd $ORACLE_HOME/rdbms/lib

ls -al *bb*.o
-rw——- 1 oracle dba 3152 Nov 7 2006 sbbdpt.o
-rw——- 1 oracle dba 2424 Nov 7 2006 ssbbded.o

make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

Linking BBED utility (bbed)
rm -f /oracle/CATY12/home/products/10203/rdbms/lib/bbed
/usr/ccs/bin/ld -o /oracle/CATY12/home/products/10203/rdbms/lib/bbed
-L/oracle/CATY12/home/products/10203/rdbms/lib/
-L/oracle/CATY12/home/products/10203/lib/ -dy
/oracle/CATY12/home/products/10203/lib/prod/lib/v9/crti.o
/oracle/CATY12/home/products/10203/lib/prod/lib/v9/crt1.o
/oracle/CATY12/home/products/10203/lib/s0main.o
/oracle/CATY12/home/products/10203/rdbms/lib/ssbbded.o
/oracle/CATY12/home/products/10203/rdbms/lib/sbbdpt.o `cat
/oracle/CATY12/home/products/10203/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10
-lnzjs10 -ln10 -lnnz10 -lnl10
/oracle/CATY12/home/products/10203/rdbms/lib/defopt.o -ldbtools10 -lclntsh
`cat /oracle/CATY12/home/products/10203/lib/ldflags` -lnsslb10 -lncrypt10
-lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat
/oracle/CATY12/home/products/10203/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10
-lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10
-lgeneric10 -lmm -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10
-lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat
/oracle/CATY12/home/products/10203/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10
-lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat
/oracle/CATY12/home/products/10203/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10
-lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10
-lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10
-lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10
-lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10
-lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10
-lcore10 -lnls10 `cat /oracle/CATY12/home/products/10203/lib/sysliblist` -R
/opt/SUNWcluster/lib/sparcv9:/oracle/CATY12/home/products/10203/lib:/opt/ORCLclu
ster/lib/ -Y
P,:/opt/SUNWcluster/lib/sparcv9:/opt/ORCLcluster/lib/:/usr/ccs/lib/sparcv9:/usr/
lib/sparcv9 -Qy -lc -laio -lposix4 -lkstat -lm
/oracle/CATY12/home/products/10203/lib/prod/lib/v9/crtn.o

cp $ORACLE_HOME/rdbms/lib/bbed $ORACLE_HOME/bin

bbed
Password: <blockedit>

BBED: Release 2.0.0.0.0 – Limited Production on Wed Sep 16 23:14:39 2009

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

************* !!! For Oracle Internal Use only !!! ***************

BBED> help all
SET DBA [ dba | file#, block# ]
SET FILENAME ‘filename’
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] ‘filename’
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]
SHOW [ | ALL ]
INFO
MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
:
N – a number which specifies a repeat count.
u – a letter which specifies a unit size:
b – b1, ub1 (byte)
h – b2, ub2 (half-word)
w – b4, ub4(word)
r – Oracle table/index row
f – a letter which specifies a display format:
x – hexadecimal
d – decimal
u – unsigned decimal
o – octal
c – character (native)
n – Oracle number
t – Oracle date
i – Oracle rowid
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
MODIFY[/x|d|u|o|c] numeric/character string
[ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
ASSIGN[/x|d|u|o] =
: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
: [ value | ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [ | ALL ]
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

BBED>

Eagle Fan oracle

H1N1新型流感与一般感冒症状比较表

September 9th, 2009

夏秋换季快到了,大家小心感冒。如果感冒,首先确认不是H1N1,如不能确认请及早就医。

H1N1新型流感 一般感冒
3-6小时内会急速发高烧(37.8度以上) 且会急速的全身性肌肉酸痛 逐渐发烧及全身性肌肉酸痛
约80%以上会有严重的头痛 轻微的头痛
无流鼻涕但有咳嗽及喉咙痛 流鼻涕及咳嗽
几乎没有打喷嚏(较不常见) 打喷嚏
37.8度以上之高烧会持续3-4天 偶会发高烧
严重的全身性肌肉酸痛、关节疼痛 轻微的全身性肌肉酸痛、关节疼痛
大多数的人会有发烧恶寒 偶会有恶寒
持续会有严重的疲劳感与虚弱 轻微的疲劳感
扁桃腺不会肿 扁桃腺会肿
会有严重的胸部压迫感 无胸部压迫感

Eagle Fan Life

如何查看一年前的metalink tar

August 13th, 2009

在metalink的选项里面最多只可以查看365天内开的tar,那么如何查看一年前开的tar呢?

首先在浏览器中设置”强制在新标签页中显示链接“,遨游浏览器在右下角的工具栏上就有这一按钮

我们在metalink SR页面中点击”show”按钮的时候,链接就显示在新的标签页中。

在新标签页的地址栏里面有字段”p_lastUpdate=90“,这里默认显示90天内的tar,将其改大到你想要的值就可以了。

Eagle Fan oracle

重现ORA-24816

July 15th, 2009

在oracle 10.2版本中,ORA-24816是一个常见的错误,错误描述如下:

24816, 00000, “Expanded non LONG bind data supplied after actual LONG or LOB column”
// *Cause: A Bind value of length potentially > 4000 bytes follows binding for
// LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
// at the end of the bind list.

解决办法很简单,如Action部分所描述的,将LONG和LOB得字段放在绑定列表的后面。

前两天有开发人员问如何解释Cause部分中的“potentially > 4000 bytes”呢?我写了一小段程序来重现这个错误:

首先我建了一个temp表,两个字段x CLOB和Y varchar2(4000)

用Perl写了两段程序:

首先是不正确的bind次序,LOB字段在varchar的前面

cat bad.pl
#!/usr/local/bin/perl

use DBI qw(:sql_types);
use Getopt::Std;
use Data::Dumper;

my $username=shift;
my $passwd= shift;
my $sid=shift;

$primary_dbh=DBI->connect(“dbi:Oracle:$sid”,$username,$passwd) || die “Can not connect to database.”;
$primary_dbh->{LongReadLen}=1024*1024*5;

$insert_sql = qq { insert into temp (
x,
y
)
values (?,?) };

$x=&lpad(“a”,”a”,10000);
$y=&lpad(“a”,”a”,4000);

$insert_sth = $primary_dbh->prepare($insert_sql);

$insert_sth->bind_param( 1, $x, SQL_LONGVARCHAR );
$insert_sth->bind_param( 2, $y);
$insert_sth->execute();

$primary_dbh->disconnect();
print “1 rows has been inserted into table\n”;
sub lpad {
#usage: &lpad(“a”,”a”, 1000000);
return($_[1] x ($_[2] – length($_[0])) . $_[0]);
}

然后是正确的Bind次序,将LOB字段放到了最后

cat good.pl
#!/usr/local/bin/perl

use DBI qw(:sql_types);
use Getopt::Std;
use Data::Dumper;

$username=shift;
$passwd= shift;
$sid=shift;

$primary_dbh=DBI->connect(“dbi:Oracle:$sid”,$username,$passwd) || die “Can not connect to database.”;
$primary_dbh->{LongReadLen}=1024*1024*5;

$insert_sql = qq { insert into temp (
y,
x
)
values (?,?) };

$x=&lpad(“a”,”a”,10000);
$y=&lpad(“a”,”a”,4000);

$insert_sth = $primary_dbh->prepare($insert_sql);

$insert_sth->bind_param( 1, $y);
$insert_sth->bind_param( 2, $x, SQL_LONGVARCHAR );
$insert_sth->execute();

$primary_dbh->disconnect();
print “1 rows has been inserted into table\n”;
sub lpad {
#usage: &lpad(“a”,”a”, 1000000);
return($_[1] x ($_[2] – length($_[0])) . $_[0]);
}

如果环境变量的NLS_LANG和数据库的NLS_CHARACTERSET一致的时候,这两个脚本都是没有问题的:

select * from v$nls_parameters where parameter =’NLS_CHARACTERSET’;
PARAMETER VALUE
—————- —–
NLS_CHARACTERSET UTF8
!env |grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.UTF8

> good.pl username password tnsname
1 rows has been inserted into table
> bad.pl username password tnsname
1 rows has been inserted into table

但是如果我们将NLS_LANG改为AMERICAN_AMERICA.WE8ISO8859P1,bad.pl将报错
bad.pl username password tnsname
DBD::Oracle::st execute failed: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column (DBD ERROR: error possibly near <*> indicator at char 14 in ‘ insert into <*>temp (
x,
y
)
values (:p1,:p2) ‘) [for Statement " insert into temp (
x,
y
)
values (?,?) " with ParamValues: :p1='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...', :p2='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...'] at bad.pl line 27.

good.pl 没有问题
good.pl username password tnsname
1 rows has been inserted into table

当我把$y=&lpad(“a”,”a”,4000);改为$y=&lpad(“a”,”a”,1333);时bad.pl执行成功,改为$y=&lpad(“a”,”a”,1334)后又不行了。

原因就是UTF8为三字节字符集,而WE8ISO8859P1为单字节字符集,因为oracle不知道里面是不是有特殊字符,所有将1334*3=4002 > 4000

Cause部分中的“potentially > 4000 bytes”就是这个意思。client和server端字符集不同只是其中的一种情况,还有其他的原因可能会导致这一情况。

解决办法就如good.pl中所示,将LOB,LONG字段放在最后就可以了。

Eagle Fan oracle 10g