Jcat
宠辱不惊,闲看庭前花开花落~~
posts - 173,comments - 67,trackbacks - 0
纯好人不用打:白羊

没人防:双子(迷宫)、天平(卡妙的冰箱)、射手(迷宫)

打死:巨蟹(紫龙)、山羊(紫龙自曝)、双鱼(阿瞬)、水瓶(冰河)

没打过,放水:狮子(星矢)、天蝎(冰河)、金牛(星矢)、处女(一辉)


这样看来紫龙是最NB的,一个人干掉2个,而且靠他师傅走后门天平不用打,还用天平的武器救了冰河。

冰河和他师傅干了2仗
冰河那段也挺NB,先是在天平被冻个半死,然后在天蝎被针扎个半死,最后到了水瓶还能把他师傅干掉
冰河和他师傅是最体现实力的一仗,纯实力对扣

合着星矢谁也没杀,就TM来打酱油的。。。
posted @ 2011-10-21 14:29 Jcat 阅读(543) | 评论 (1)编辑 收藏
简单过一遍,详细的以后遇到慢慢研究。
主要的更新在几个方面:
1. OUI的改进
2. Oracle Restart
3. ASM的增强!!!


New Grid Infrastructure Installation Option
 1. 单点包括:ASM、listener和Oracle Restart(监控、管理并自动重启各个组件)
 2. 集群包括:ASM、listener和Clusterware

New Desktop and Server Class Options
 1. Desktop Class:适用于笔记本、台式机
 2. Server Class:适用于服务器(功能上没区别,多一些高级配置选项)

Daylight Savings Time Upgrade of Timestamp with Timezone Data Type
 新的DBMS_DST包,优化对TIMESTAMP WITH TIMEZONE数据的管理

SYSASM Privilege
 管理ASM需要SYSASM权限,旨在分清ASM管理和DB管理

Fixup Scripts and Prerequisite Checks
 安装前检查时,如果遇到不符合要求的配置,OUI会对一些检查项自动生成fixup脚本,用root执行就可以解决相应问题。

New Tool to Configure Custom Installation Options
 OUI不在提供对单个组件的配置功能,如果需要只能用$ORACLE_HOME/bin/chopt命令行进行配置。我想Oracle的趋势就是为了让更多已经成熟的配置自动化,简化使用。

Deinstallation Tool
 OUI不再用来删除oracle软件,请使用$ORACLE_HOME/deinstall

Intelligent Data Placement
 指定ASM磁盘的磁盘范围,旨在将高频访问的数据放在HOT region(比如磁盘的外道)

Oracle Automatic Storage Management Cluster File System (Oracle ACFS)
 为其它文件提供ASM的存储功能

Data Pump Export and Data Pump Import
 Data Pump兼容Export/Import

Use Oracle Restart to Automatically Restart Your Database

 1. 针对单点环境
 2. 自动重启又问题的组件,如:db instance、listener、asm instance

New Method of Installing Oracle Automatic Storage Management
 以前,ASM的安装是伴随着DB的安装;现在是伴随着Software的安装。
 其实,就是把ASM上升到一个软件的高度(以前只是db的一个组件)

SRVCTL Support for Single Instance Database in a Cluster
 SRVCTL统一管理单点(with Restart)和集群数据库(with Clusterware)

Deprecated in Oracle Database 11g Release 2
 不支持裸设备了:要么用文件系统、要么用ASM,说白了,企业环境就必须用ASM
 不支持Oracle Ultra Search(9i的一个什么鸟功能)






















posted @ 2011-06-17 15:35 Jcat 阅读(802) | 评论 (0)编辑 收藏
重装完系统,mysql不需要重装,直接当绿色版使用,还更干净

//启动MYSQL
cd $MYSQL_HOME/bin
D:\JAVA\MYSQL\mysql-5.1.53-win32\bin>mysqld --console      
110616  1:26:26 [Note] Plugin 'FEDERATED' is disabled.
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
110616  1:26:26  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
110616  1:26:26  InnoDB: Started; log sequence number 0 44233
110616  1:26:27 [Note] Event Scheduler: Loaded 0 events
110616  1:26:27 [Note] mysqld: ready for connections.
Version: '5.1.53-community'  socket: ''  port: 3306  MySQL Community Server (GPL
)

//简单使用

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.03 sec)

mysql> use mysql
Database changed

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |


登陆
D:\JAVA\MYSQL\mysql-5.1.53-win32\bin>mysql.exe -uroot
创建数据库
mysql> create database testdb;




posted @ 2011-06-16 01:40 Jcat 阅读(917) | 评论 (1)编辑 收藏
--主键是非分区索引,也可以看作是全局
create table test_par1
(
  tdate   varchar2(8) primary key
)
partition by range ( tdate )
(
     partition p1 values less than ('20090201'),
     partition p2 values less than ('20090301'),
     partition pm values less than (MAXVALUE)  
) tablespace test;


--主键是分区索引
create table test_par2
(
  tdate   varchar2(8)
)
partition by range ( tdate )
(
     partition p1 values less than ('20090201'),
     partition p2 values less than ('20090301'),
     partition pm values less than (MAXVALUE)  
) tablespace test;

create index i_tdate2 on test_par2(tdate) local;

alter table test_par2 add constraint pk_tdate2 primary key(tdate);



--查看test_par2的DDL
select dbms_metadata.get_ddl( 'TABLE', 'TEST_PAR2' ) from dual;
--整理如下
create table test_par3
(
  tdate   varchar2(8),
  constraint pk_tdate3 primary key (tdate) using index local
)
partition by range ( tdate )
(
     partition p1 values less than ('20090201'),
     partition p2 values less than ('20090301'),
     partition pm values less than (MAXVALUE)  
) tablespace test;


这个案例也告诉我们,在做DDL时,尽量还是显示的写出属性,一些简易语法会引起不可知的定义。最后都用 get_ddl 再查一下,这才是Oracle真正执行的DDL。
posted @ 2010-09-15 15:26 Jcat 阅读(1273) | 评论 (0)编辑 收藏
列出所有实例
[db2inst1@dcm ~]$ db2ilist
db2inst1

列出当前实例下的所有数据库

[db2inst1@dcm ~]$ db2 list db directory

 System Database Directory

 Number of entries in the directory = 1

Database 1 entry:

 Database alias                       = SAMPLE
 Database name                        = SAMPLE
 Local database directory             = /home/db2inst1
 Database release level               = d.00
 Comment                              =
 Directory entry type                 = Indirect
 Catalog database partition number    = 0
 Alternate server hostname            =
 Alternate server port number         =

启动实例
[db2inst1@dcm ~]$ db2start
07/09/2010 14:24:36     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.

连接到数据库
[db2inst1@dcm ~]$ db2 connect to sample

   Database Connection Information

 Database server        = DB2/LINUX 9.7.1
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE

执行SQL
[db2inst1@dcm ~]$ db2
db2 => select * from staff where dept=20

ID     NAME      DEPT   JOB   YEARS  SALARY    COMM     
------ --------- ------ ----- ------ --------- ---------
    10 Sanders       20 Mgr        7  98357.50         -
    20 Pernal        20 Sales      8  78171.25    612.45
    80 James         20 Clerk      -  43504.60    128.20
   190 Sneider       20 Clerk      8  34252.75    126.50

  4 record(s) selected.

退出
db2 => quit
DB20000I  The QUIT command completed successfully.

断开连接(不断开就不能db2stop)
[db2inst1@dcm ~]$ db2 connect reset
DB20000I  The SQL command completed successfully.

关闭实例
[db2inst1@dcm ~]$ db2stop
07/09/2010 14:29:32     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.

posted @ 2010-07-09 14:32 Jcat 阅读(244) | 评论 (0)编辑 收藏
最近初探了一下DB2,发现关于“数据库”、“实例”的概念及其关系容易把人弄晕,这里小小总结一下,并把Oracle也拉进来一起整。
另外,发现Oracle和IBM老搞一些理论上就针锋相对的事情,如RAC vs DPF (database partitioning feature),很是有趣。



基本概念还是相同的
数据库软件(下面简称软件:软件本身,一台主机安装一套就可以了。(抛开你故意在一台服务器上安装2遍Oracle/DB2这种不正常思维)

实例:数据库软件启动后的“进程+内存”
软件+实例的关系:一台电脑只需要按照一套QQ(软件),但是我们可以多用户登录(实例)。换到哲学的角度,就是抽象和具体的关系。
数据库(狭义,下面简称:一堆文件(数据文件、控制文件、日志文件、参数文件)
它和软件的区别:软件是厂商卖给你的东西;是你自己的东西(业务、应用)
它和实例的关系:用户需要借助实例(所提供的各种手段)来访问
就相当于是QQ聊天记录

最后:数据库(广义)= 软件 + 实例 + 库
一台服务器(即一套数据库软件)可以建多个实例,多个库,且互不相干


体系结构的不同之处
Oracle  实例和库一一对应
DB2     一个实例可以挂多个库


高级情况(简单提一下,以后再慢慢研究)
Oracle:RAC一个库被多个实例挂
DB2:DPF一个实例多个库
在数据库集群模式设计方面,有Share everything架构和Share nothing架构,前者以ORACLE RAC为代表,IBM DB2 Purescale为挑战者;后者以IBM DB2 DPF为代表。

posted @ 2010-07-08 18:26 Jcat 阅读(412) | 评论 (0)编辑 收藏
行链接:
1. 一条记录的大小大于block size,则产生行链接
2. 容易发生在比较大的行上
3. 因为行链接是由db_block_size不够大引起的,所以对已有的行链接是无法清除的
4. 9i以后,可以对不同的表空间设置不同的db_block_size,可以将一些特殊的宽表放在大block size的表空间

例子:
表空间block size为8k(8192),因为数据块头也要占一定空间,所以如下例,实际只能放7948的数据,一旦超过,就产生行链接

--无
create table test7948(a char(2000),b char(2000),c char(2000),d char(1948))
tablespace test;

insert into test7948 values('a','b','c','d');
commit;

--有
create table test7949(a char(2000),b char(2000),c char(2000),d char(1949))
tablespace test;

insert into test7949 values('a','b','c','d');
commit;



行迁移:
1. 本来是放的下的
2. 因为更新使row size变大了,一个block里又不足以放下增加的空间(PCTFREE相关),则产生行迁移
3. 容易发生在PCTFREE较小,对类似varchar类型的update又很多的表上
4. 无法避免,但通过把数据导出导入进行清除

例子:
--无
create table test7948_vchar(a char(2000),b char(2000),c char(2000),d char(1940), e varchar(9))
tablespace test;

insert into test7948_vchar values('a','b','c','d','12345678');
commit;

一更新,使得row size大于7948了,产生行迁移
--有
update test7948_vchar set e='123456789'
posted @ 2010-06-13 14:08 Jcat 阅读(223) | 评论 (0)编辑 收藏
随着Oracle收购SUN,今天又爆出SAP收购Sybase的大料。

现状:
Oracle和IBM已经成为诺亚方舟级的厂商,啥都有。
微软,SAP成为航母级的厂商,软件方面啥都有,但目前没有硬件。

猜想:who's next? Dell? HP?
不然微软把Dell收了吧,组成BDll公司;
然后SAP和HP合并为SHP
posted @ 2010-05-14 11:24 Jcat 阅读(228) | 评论 (0)编辑 收藏
--创建一个大一点的TEMP表空间
create temporary tablespace temp1
tempfile '/oracledatafile/temp01.dbf' SIZE 100m autoextend on next 100m maxsize 5000m;
 
--切换默认TEMP表空间
alter database default temporary tablespace temp1;

--删掉以前的TEMP表空间
drop tablespace temp including contents and datafiles;
posted @ 2010-04-30 11:05 Jcat 阅读(275) | 评论 (0)编辑 收藏
1. 物化视图由于是物理真实存在的,故可以创建索引。




--为基表创建MLOG
--创建物化视图时应先创建存储的日志空间,否则建MV时报错
--ORA-23413: table "SCOTT"."EMP" does not have a materialized view log

create materialized view log on scott.emp
tablespace test
/


--创建物化视图
create materialized view test_mv
tablespace test
parallel (degree 4)
build immediate refresh fast
enable query rewrite
as
select * from scott.emp
/


--查看一下结果,果然很符合物化视图的定义,一个表+一个视图
SQL> select object_name, object_type from user_objects where object_name = 'TEST_MV';
OBJECT_NAME    OBJECT_TYPE
-----------    --------
TEST_MV        TABLE
TEST_MV        MATERIALIZED VIEW

SQL> select mview_name, container_name from user_mviews;
MVIEW_NAME       CONTAINER_NAME
---------------- ------------------------------
TEST_MV          TEST_MV  (这就是那个存储表)

--查看MLOG的情况
--注意:MLOG的所属和MV的所属并不是同一个
SQL> select log_owner, master, log_table from dba_mview_logs
LOG_OWNER    MASTER    LOG_TABLE
---------------------------------
SCOTT        EMP    MLOG$_EMP (MLOG其实也就是一个表)

SQL> desc scott.mlog$_emp;
Name            Type
-------------------------------
EMPNO            NUMBER(4)
SNAPTIME$$        DATE
DMLTYPE$$        VARCHAR2(1)
OLD_NEW$$        VARCHAR2(1)
CHANGE_VECTOR$$        RAW(255)



--删除MLOG
drop materialized view log on 物化视图所依赖的表名; 
--删除物化视图
drop materialized view 物化视图名;
posted @ 2010-01-13 00:04 Jcat 阅读(521) | 评论 (2)编辑 收藏
注意,为了能在终端看见put_line的输出,还需要先开启
set serveroutput on

 

--用来测试的表
create table test_tri(
a1 int,
a2 int
)
tablespace test


-----行级insert触发器
-----
1) 插入的一行新数据保存在:new
2)
insert触发器没有:old值
3) 对:new的修改,只能定义在before类型的触发器中

---触发器语法---
create or replace trigger 名称
[after|before] [delete|update|insert]
[of 列名] [on 表名]
[referencing new as 新行别名 old as 旧行别名]
[for each row] [when(条件)]
declare
....
begin
...
exception
....
end;


--定义
create or replace trigger test_before_insert
before insert on test_tri
for each row when(new.a2 is null)
begin
    dbms_output.put_line('insert row original: a1=' || :new.a1 || ' a2=' || :new.a2);
    :new.a2 := :new.a1 * 2;   
end;
/

create or replace trigger test_after_insert
after insert on test_tri
for each row
begin
    dbms_output.put_line('insert row actual: a1=' || :new.a1 || ' a2=' || :new.a2);   
end;
/

--测试

SQL> insert into test_tri(a1) values(1);
insert row original: a1=1 a2=
insert row actual: a1=1 a2=2

SQL> insert into test_tri values(2,3);
insert row actual: a1=2 a2=3

SQL> select * from test_tri;
        A1         A2
---------- ----------
         1          2(由触发器生成的值)
         2          3



-----DDL触发器-----
--任何create语句都会触发这个语句

create or replace trigger test_ddl_trigger
before create on schema
begin
    dbms_output.put_line( 'DDL Trigger' );
    insert into test_tri values(9,9);
end;
posted @ 2010-01-11 14:58 Jcat 阅读(251) | 评论 (0)编辑 收藏
Oracle建好后,tnsnames和listener中自动就带有如下内容,这里咱们就来解释一下这些东西是干什么用的

----TNSNAMES.ora----
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
    )
    (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

----LISTENER.ora----
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /opt/oracle/10gR2)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = dcm)(PORT = 1521))
    )
  )


IPC - Inner Process Communication
When a process is on the same machine as the server, use the IPC protocol for connectivity instead of TCP. Inner Process Communication on the same machine does not have the overhead of packet building and deciphering that TCP has.
I've seen a SQL job that runs in 10 minutes using TCP on a local machine run as fast as one minute using an IPC connection. The difference in time is most dramatic when the Oracle process has to send and/or receive large amounts of data to and from the database.
For example, a SQL*Plus connection that counts the number of rows of some tables will run about the same amount of time, whether the database connection is made via IPC or TCP. But if the SQL*Plus connection spools much data to a file, the IPC connection will often be much faster -- depending on the data transmitted and the machine workload on the TCP stack.

For how to configure it:
1. you should add one IPC line in the LISTENER.ORA
2. You should also add one IPC line in the TNSNAMES.ORA



PLSExtPro - PL/Sql External Procdure
默认安装时,会安装一个PL/SQL外部程序(extproc--这是程序名)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字(也就是SID)通常是ExtProc或PLSExtProc
但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,Oracle也是建议删除的。



extproc的作用
就是在pl/sql中调用外部语句,如c,java写的过程。
现在,Oracle已经全面支持JAVA了,这东西也就过时了,之所以继续保留是考虑到兼容以前老版本的数据库实例。

[oracle@dcm bin]$ extproc
Oracle Corporation --- TUESDAY   JAN 05 2010 21:58:23.878
Heterogeneous Agent Release 10.2.0.1.0 - Production

posted @ 2010-01-05 21:59 Jcat 阅读(642) | 评论 (0)编辑 收藏
--登录sys用户,创建一个测试用户,权限可以给大点
SQL> create user test identified by xxxxx;
SQL> grant connect to test;
SQL> grant resource to test;
SQL> grant dba to test;


--登录test用户,开始测试
--建个测试表
create table test_table(id int, time timestamp);

--创建Job
begin
dbms_scheduler.create_job(
    job_name => 'test_job',
    job_type => 'PLSQL_BLOCK',
    job_action => 'insert into test_table
                  (select nvl(max(id),0)+1, systimestamp from test_table, dual);', --nvl函数同SQLServer的isnull函数
    start_date => null, --一激活,就开始
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=10');
end;

FREQ用来指定间隔的时间周期,可选参数有:YEARLY,MONTHLY,WEEKLY,DAILY,HOURLY,MINUTELY,SECONDLY。

--光创建没用,还需要激活;也可以在创建时,直接把enable属性设置为true(enabled => true
select job_name, enabled, run_count from user_scheduler_jobs;
JOB_NAME                       ENABL  RUN_COUNT
------------------------------ ----- ----------
TEST_JOB                       FALSE          0


begin
dbms_scheduler.enable('test_job');
end;

--查看效果
select id, to_char(time,'HH24:MI:SS:FF3') from test_table;
       ID  TO_CHAR(TIME,'HH24
---------- ------------------
         1 16:13:29:542
         2 16:13:39:506
         3 16:13:49:109
         4 16:13:59:097
         5 16:14:09:109
         6 16:14:19:103
         7 16:14:29:101
         8 16:14:39:099
         9 16:14:49:105
        10 16:14:59:100


--停止任务
begin
dbms_scheduler.disable('test_job');
end;

--删除任务
begin
dbms_scheduler.drop_job('test_job');
end;
posted @ 2009-12-17 16:13 Jcat 阅读(237) | 评论 (0)编辑 收藏

一致和并发是对立的,需要根据应用,选择权宜之计


数据不一致的现象

---事务内单SQL的情况---
1.脏读-Dirty Read:本事务读取了其它事务尚未提交的修改数据
例子:读了不该读的
1:00 x=1
1:01 A用户 Update x=2(但未commit)
1:02 B用户 Select x --> x=2
合理的情况是x仍然等于1

---事务内多SQL的情况(典型的如,先查再改)---
2.不可重复读-Non Repeatable Read
例子1:自相矛盾
1:00 x=1 y=2
1:01 B用户 Select x,y --> x=1 y=2
1:02 A用户 Update x=2; Commit;
1:03 B用户 Select x+y --> x+y=4
首先这个结果从单条SQL的角度看,是没有问题的。但是,如果把B的两次查询看作一个整体(事务),那么合理的情况应该是
  x+y仍然等于3
  或者B再进行一次事务,得出 x=2 y=2 x+y=4 的结果


例子2:更新丢失
1:00 x=1
1:01 B用户 Select x --> x=1
1:02 A用户 Select x --> x=1
1:03 A用户 Update x=2; Commit;
1:04 B用户 Update x=3; Commit;
同样,从单条SQL来讲,没有任何问题。
但是从逻辑的合理性讲,一般的更新操作都是先查再改,换言之
  A真正想做的是Update x from 1 to 2
  B真正想做的是Update x from 1 to 3
但最终却造成了在B不知情的情况下,把B的初衷改为了Update x from 2 to 3


3.幻影读-Phantom Read
例子:读到了未来
1:00 X1=1 X2=2
1:01 B用户 Select Xi --> X1=1 X2=2
1:02 A用户 Insert X3=3; Commit;
1:03 B用户 Select sum(Xi) --> re=6
其实道理和之前的不可重复读相同,只不过是由Insert引起的罢了。
(甚至Delete也会引起类似的问题,但好像学术界并没有对Delete进行讨论)




Isolation Level
Read Uncommitted:1,2,3都会发生
  Oracle中严格禁止脏读
  在SQL Server 7.0中,是可以选择该级别的
Read Committed:发生2,3(Oracle的默认级别)
Repeatable Read:发生3
Serializable:都不发生


Oracle的实现方式
Read Committed:默认就实现
Repeatable Read:
  1. 悲观锁(select ... for update),影响并发
  2. 乐观锁(update where 所有字段都作为条件),不影响并发
Serializable:
  alter session set isolation_level=serializable/read only
posted @ 2009-12-05 17:45 Jcat 阅读(208) | 评论 (0)编辑 收藏