数据类型
SQL语句类型介绍
SELECT基础
数据类型
1. 数据类型
a) 数据类型是在设计表结构中需要定义的,选择适当的数据类型可以节省存储空间,提高运算效率。
b) Oracle数据类型主要包括字符型、数据型、日期/时间型、大对象(LOB)型等
2. 字符型
3. 数值型
4. 日期/时间类型
5. 大对象(LOB)类型
SQL语句类型介绍
1. SQL语句类型
a) 数据操纵语言DML (Data Manipulation Language)
i. 用于操作数据
ii. 如:insert into,update,delete
b) 数据定义语言DDL (Data Definition Language)
i. 用于创建对象
ii. 如:create table ,alter table,drop table,create view;
c) 数据控制语言DCL (Data Control Language)
i. 用于访问权限的控制
ii. 如revoke,grant,commit,rollback
2. SELECT语句
a) SELECT语句的基本语法
SELECT 子句
FROM 子句
[WHERE 子句]
b) 说明
i. SELECT 子句:指定查询结果集的列的组成,列表中的列可以来自一个或多个表或视图
ii. FROM 子句:指定要查询的一个或多个表或视图
iii. WHERE 子句:指定查询的条件
3. 相关说明
a) 在本课程中,关键字、子句和语句定义如下:
b) 关键字
i. 是指单个的SQL元素。
ii. 例如,SELECT和FROM都是关键字
c) 子句
i. 是SQL语句的一部分。
ii. 例如,SELECT employee_id,last_name,…就是一个子句
d) &nbs
Oracle Data Pump 技术可以非常快速地将一个数据库的数据与元数据迁移到另一个数据库。
Oracle Data Pump 由三大独一无二的部分构成:
1. 命令行客户端:expdp 和 impdp
2. DBMS_DATAPUMP PL/SQL 包(也称为 Data Pump API)
3. DBMS_METADATA PL/SQL 包(也称为 Metadata API)
与传统的基于客户端的 Export/Import 工具相比,Data Pump 是一种基于服务器的实用工具。
Oracle Data Pump 与 Export/Import 的功能并不兼容。
Oracle Data Pump 还可以使用 NETWORK_LINK 功能,在无需 dump 文件的情况下,在两个数据库
之间利用网络技术从远程数据库迁移数据和元数据。
二、Data Pump 实用工具的安装与配置
用户需要一定的权限才能运行 Data Pump。在 Oracle 10g 或更高版本运行 Export DataPump 或
Import DataPump job 所需的最低权限要求如下:
- 系统权限 CREATE SESSION (或 CONNECT 角色)
- 系统权限 CREATE TABLE
- 对象权限 对某个有效 directory 对象的读写权限 (CREATE DIRECTORY privilege with which a valid directory object was created)
- 对用户的默认表空间需要足够的表空间配额(需要创建 DataPump job 所使用的主抽样表)。
此外,Data Pump 还需要 EXP_FULL_DATABASE 角色来执行以下任务:
- 运行全库 Export DataPump 作业
- 运行传输表空间 Export DataPump 作业
- 运行带有 TRACE 参数的 Export DataPump 作业
- 运行导出其他 schema 的 Export DataPump 作业
注意,上述权限要求适用于链接数据库运行 Export DataPump 或 Import DataPump 作业的用户,而非被导出或导入的用户
这些权限既可以通过显式的方式授予也可以通过角色来授予,方法如下:
CONNECT system/manager
CREATE DIRECTORY my_dir AS 'full_pre_existing_directory_path_here';
GRANT create session, create table TO scott IDENTIFIED BY tiger;
GRANT read, write ON DIRECTORY my_dir TO scott;
ALTER USER scott QUOTA unlimited ON users;
或者:
CONNECT system/manager
CREATE DIRECTORY my_dir AS 'full_pre_existing_directory_path_here>>';
CREATE ROLE expdp_role;
GRANT create session, create table TO expdp_role;
GRANT read, write ON DIRECTORY my_dir TO expdp_role;
GRANT expdp_role TO scott;
ALTER USER scott DEFAULT ROLE all;
ALTER USER scott QUOTA unlimited ON users;
特权用户:
特权用户是指具有执行 Export DataPump 作业的 EXP_FULL_DATABASE 角色和执行
Import DataPump 作业的 IMP_FULL_DATABASE 或者包含这两种角色的 DBA 角色:
SET lines 80
COL privilege FOR a40
SELECT grantee, granted_role, default_role
FROM dba_role_privs
WHERE granted_role IN ('DBA', 'EXP_FULL_DATABASE', 'IMP_FULL_DATABASE')
ORDER BY 1,2;
GRANTEE GRANTED_ROLE DEF
-------------------- ------------------------------ ---
DBA EXP_FULL_DATABASE YES
DBA IMP_FULL_DATABASE YES
SCOTT EXP_FULL_DATABASE YES
SCOTT IMP_FULL_DATABASE YES
SYS DBA YES
SYS EXP_FULL_DATABASE YES
SYS IMP_FULL_DATABASE YES
SYSMAN DBA YES
SYSTEM DBA YES
使用 DataPump LOGFILE 参数可以将正在进行、已完成的工作以及遇到的错误相关的消息全部写入一个日志文件。
在检查 Data Pump 问题时应首先查看该日志文件。
也可以指定未证实公开的 METRICS=y 参数在该日志文件中记录额外的对象数量以及所花时间相关的信息。
日志文件中报告的错误消息并不意味着 Data Pump 作业执行失败 。有些消息报告的只是警告信息和通知信息。例如,
有关对象已存在和被跳过的信息。在出现这种情况时,可以it过调整 IMPDP 目录参数来重建这些对象或者往这些已
存在的对象附加数据。
与 DataPump job 权限相关的实用sql脚本
--查看连接数据库执行 DataPump job 的用户是否具有 CREATE SESSION 和 CREATE TABLE 权限
SET lines 80 pages 50
COL privilege FOR a40
SELECT grantee, privilege
FROM dba_sys_privs
WHERE (grantee IN ('SCOTT', 'PUBLIC')
OR grantee IN (SELECT granted_role FROM dba_role_privs
WHERE grantee IN ('SCOTT', 'PUBLIC')))
AND privilege IN ('CREATE SESSION', 'CREATE TABLE')
ORDER BY 1,2;
GRANTEE PRIVILEGE
------------------------------ ----------------------------------------
SCOTT CREATE SESSION
SCOTT CREATE TABLE
--查看链接数据库运行 DataPump job 的用户所授予的角色及其默认角色
SET lines 80
SELECT grantee, granted_role, default_role
FROM dba_role_privs
WHERE grantee IN ('SCOTT', 'PUBLIC') ORDER BY 1,2;
GRANTEE GRANTED_ROLE DEF
------------------------------ ------------------------------ ---
SCOTT EXP_FULL_DATABASE YES
SCOTT IMP_FULL_DATABASE YES
查询连接数据库运行 DataPump job 的用户所授予的 directory 权限
SET lines 100
COL privilege FOR a10
COL grantee FOR a20
COL owner FOR a20
SELECT p.grantee, p.privilege, p.owner, d.directory_name
FROM dba_tab_privs p, dba_directories d
WHERE p.table_name=d.directory_name
AND (grantee IN ('SCOTT', 'PUBLIC')
OR grantee IN (SELECT granted_role FROM dba_role_privs
WHERE grantee IN ('SCOTT', 'PUBLIC')))
ORDER BY 4,3,2;
GRANTEE PRIVILEGE OWNER DIRECTORY_NAME
-------------------- ---------- -------------------- ----------------------
IMP_FULL_DATABASE READ SYS DATA_PUMP_DIR
EXP_FULL_DATABASE READ SYS DATA_PUMP_DIR
EXP_FULL_DATABASE WRITE SYS DATA_PUMP_DIR
IMP_FULL_DATABASE WRITE SYS DATA_PUMP_DIR
SCOTT READ SYS MY_DIR
SCOTT WRITE SYS MY_DIR
--查看连接数据库运行 DataPump job 的用户的默认表空间
SET lines 80
SELECT username, default_tablespace
FROM dba_users WHERE username IN ('SCOTT');
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------&nbs
在10G中默认KFED是没有现成可以使用的,但是我们可以手工编译它。
0. 编译KFED
我们可以使用make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk ikfed命令来编译它,记得要在lib目录下执行编译:
[oracle@gtser1 ~]$ which kfed
/usr/bin/which: no kfed in (/home/oracle/bin:/u01/oracle/10g/product/10.2.0/db_1/bin:/usr/bin:/usr/ccs/bin:/etc:/bin:/usr/openwin/bin:/usr/local/bin:/usr/X11R6/bin:)
[oracle@gtser1 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@gtser1 lib]$ make -f ins_rdbms.mk ikfed
Linking KFED utility (kfed)
rm -f /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/kfed
gcc -o /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/kfed -L/u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/ -L/u01/oracle/10g/product/10.2.0/db_1/lib/ -L/u01/oracle/10g/product/10.2.0/db_1/lib/stubs/ /u01/oracle/10g/product/10.2.0/db_1/lib/s0main.o /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/sskfeded.o /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/skfedpt.o /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/defopt.o -ldbtools10 -lclntsh `cat /u01/oracle/10g/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/oracle/10g/product/10.2.0/db_1/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 /u01/oracle/10g/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/oracle/10g/product/10.2.0/db_1/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 /u01/oracle/10g/product/10.2.0/db_1/lib/sysliblist` -Wl,-rpath,/u01/oracle/10g/product/10.2.0/db_1/lib -lm `cat /u01/oracle/10g/product/10.2.0/db_1/lib/sysliblist` -ldl -lm -L/u01/oracle/10g/product/10.2.0/db_1/lib
mv -f /u01/oracle/10g/product/10.2.0/db_1/bin/kfed /u01/oracle/10g/product/10.2.0/db_1/bin/kfedO
mv /u01/oracle/10g/product/10.2.0/db_1/rdbms/lib/kfed /u01/oracle/10g/product/10.2.0/db_1/bin/kfed
chmod 751 /u01/oracle/10g/product/10.2.0/db_1/bin/kfed
[oracle@gtser1 lib]$ which kfed
/u01/oracle/10g/product/10.2.0/db_1/bin/kfed
这样我们就完成了KFED工具编译,接下来就可以正常使用它了。
1. 使用KFED命令
KFED提供了哪些命令选项呢?我们看下帮助选项就知道了。
[oracle@gtser1 lib]$ kfed -help
as/mlib ASM Library [asmlib='lib']
aun/um AU number to examine or update [AUNUM=number]
aus/z Allocation Unit size in bytes [AUSZ=number]
blkn/um Block number to examine or update [BLKNUM=number]
blks/z Metadata block size in bytes [BLKSZ=number]
ch/ksum Update checksum before each write [CHKSUM=YES/NO]
cn/t Count of AUs to process [CNT=number]
d/ev ASM device to examine or update [DEV=string]
o/p KFED operation type [OP=READ/WRITE/MERGE/REPAIR/NEW/FORM/FIND/STRUCT]
p/rovnm Name for provisioning purposes [PROVNM=string]
s/eek AU number to seek to [SEEK=number]
te/xt File name for translated block text [TEXT=string]
ty/pe ASM metadata block type number [TYPE=number]
2. KFED查看header信息
这个工具可以在ASM没有启动的情况下使用,因此我们就关闭ASM验证下到底可不可以。
[oracle@gtser1 lib]$ export ORACLE_SID=+ASM
[oracle@gtser1 lib]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.5.0 - Production on Sat Mar 2 16:24:14 2013
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> shutdown immediate;
ASM diskgroups dismounted
ASM instance shutdown
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
在10.2.0.5版本之前header信息是没有额外保护的,而且header信息非常容易损坏,好在之后版本做了额外的备份保护,我们后面会描述到。
使用KFED查看header信息:
[oracle@gtser1 lib]$ kfed read /dev/raw/raw1
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD--表示这是HEAD数据信息
kfbh.datfmt: 1 ; 0x003: 0x01
kfbh.block.blk: 0 ; 0x004: T=0 NUMB=0x0
kfbh.block.obj: 2147483648 ; 0x008: TYPE=0x8 NUMB=0x0
kfbh.check: 3544975665 ; 0x00c: 0xd34c0931
kfbh.fcn.base: 48 ; 0x010: 0x00000030
kfbh.fcn.wrap: 0 ; 0x014: 0x00000000
kfbh.spare1: 0 ; 0x018: 0x00000000
kfbh.spare2: 0 ; 0x01c: 0x00000000
kfdhdb.driver.provstr: ORCLDISK ; 0x000: length=8
kfdhdb.driver.reserved[0]: 0 ; 0x008: 0x00000000
kfdhdb.driver.reserved[1]: 0 ; 0x00c: 0x00000000
kfdhdb.driver.reserved[2]: 0 ; 0x010: 0x00000000
kfdhdb.driver.reserved[3]: 0 ; 0x014: 0x00000000
kfdhdb.driver.reserved[4]: 0 ; 0x018: 0x00000000
kfdhdb.driver.reserved[5]: 0 ; 0x01c: 0x00000000
kfdhdb.compat: 168820736 ; 0x020: 0x0a100000
kfdhdb.dsknum: 0 ; 0x024: 0x0000--disk号
kfdhdb.grptyp: 1 ; 0x026: KFDGTP_EXTERNAL--DG冗余类型
kfdhdb.hdrsts: 3 ; 0x027: KFDHDR_MEMBER--disk status信息
kfdhdb.dskname: DISK1 ; 0x028: length=5--disk name
kfdhdb.grpname: DATA01 ; 0x048: length=6--dg name