[sql]代码库
第十八章 备份恢复SQLLoader和数据库设计范式
备份 恢复 SQLLoader
1、imp 导入 import
2、exp 导出 export
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:
1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中
2. 建立数据库间的 dblink,然后用 create table B as select * from A where ...,或 insert into B select * from A where ...
3. exp A 表,再 imp 到 B 表,exp 时可加查询条件
4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交
5. 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显
3、SQL Loader
sql loader 的用法:
1. 只使用一个控制文件,在这个控制文件中包含数据(推荐)
2. 使用一个控制文件(作为模板) 和一个数据文件
Csv文件如下:(dept1.csv)
" ","DEPTNO","DNAME","LOC"
"1","10","ACCOUNTING","NEW YORK"
"2","20","RESEARCH","DALLAS"
"3","30","SALES","CHICAGO"
"4","40","OPERATIONS","BOSTON"
"5","50","sdsaf","adf"
"6","12","aaa","aaa"
Ctl文件如下:(dept1.ctl)
方式一:
Load data Infile c:\dept1.csv truncate
Into table dept1
(
Deptno position(1:2),
Dname position(3:5),
Loc position(6:8)
)
方式二:
OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行
LOAD DATA
INFILE "c:\dept1.csv" --指定外部数据文件,可以写多个 INFILE "another_data_file.csv" 指定多个数据文件
--这里还可以使用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件, append --操作类型,用 truncate table 来清除表中原有记录 INTO TABLE dept1 -- 要插入记录的表
Fields terminated by "," -- 数据中每行记录用 "," 分隔
Optionally enclosed by '"' -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时 trailing nullcols --表的字段没有对应的值时允许为空
(
virtual_column FILLER, --跳过由 PL/SQL Developer 生成的第一列序号 deptno ,--"dept_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值 dname ,--"'Hi '||upper(:dname)",--,还能用SQL函数或运算对数据进行加工处理
loc )
说明:在操作类型 truncate 位置可用以下中的一值:
1) insert --为缺省方式,在数据装载开始时要求表为空
2) append --在表中追加新记录
3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录
4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
执行命令
Sqlldr scott/tiger control=dept1.ctl
看看日志文件, 坏数据文件,从中可让你更好的理解 Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息
rman备份资料
http://www.xujiansheng.cn/2013/07/oracle-restores-the-backups-and-rman-commands/
http://www.askmaclean.com/archives/12cr1-rman.html
http://express.ruanko.com/ruanko-express_23/technologyexchange8.html
数据库设计范式
1、 第一范式:字段要设计的不可再分
Name 字段 可拆分成 FirstName+LastName
2、 第二范式:两个表的关系,在第三张关系表中体现
比如学生和课程表。为多对多的关系。这种关系需要在第三张表中体现
3、 第三范式:多张表中,只存关系,不存具体信息(具体开发中用的最多)
比如: emp,dept
如果一对多用第三张表(关系表)来表示,则会出现问题。(一个员工可能属于多个部门,显然这是不符合现实逻辑的)
4、 总范式 数据库表关联越少越好,SQL 语句复杂度越低越好
三种范式其实只供参与。数据库设计原则:数据库表关联越少越好,SQL 语句复杂度越低越好。所以有时候,违反了第三范式,但是简化了查询语句。加快的检索速度。
例如:我们开发的某日本项目中,
serviceoffice (serviceofficeid) (1——>N) careuserham (careuid serviceofficeid) careuserham (careuid serviceofficeid) (1——>N) helperassign (assigned careuid servicedate
serviceofficeid)
这里的 helperassign表中的 serviceofficeid 就是冗余字段,不符合第三范式。但是因为加上这个字段,使的检索速度加快不下 10倍