查看: 2650|回复: 0

[Oracle数据库] ORACLE手工建库

发表于 2018-4-3 08:00:08

手动建库:
找到官方文档,打开主索引
找到管理--create database
停止现有的数据库,释放内存

1.设置环境变量--ORACLE_SID
2.建立密码文件
3.建立文本的参数文件
4.建立二进制参数文件
5.建立参数文件中描述的路径
6.启动数据库到nomount
7.create database...
8.运行脚本: @$ORACLE_HOME/rdbms/admin/catalog 建立数据字典
@$ORACLE_HOME/rdbms/admin/catproc 建立应用的包
9.建立示例方案
conn system/a@$ORACLE_HOME/sqlplus/admin/pupbld
br/>@$ORACLE_HOME/sqlplus/admin/pupbld
@$ORACLE_HOME/rdbms/admin/utlsampl.sql

打开官方文档
Supporting Documentation
Administratior's Guide
2 creating and configuring an Oracle Database
第三项:Creating a Database with the CREATE DATABASE Statement
Step 9: Issue the CREATE DATABASE Statement

1.关闭其他所有的数据库。
2.建立新数据库(yy)的密码文件
ORACLE用户执行
cd $ORACLE_HOME/dbs
rapwd file=orapwyy password=a

3.建立文本的参数文件
strings spfileqq.ora (找一个已经存在的参数文件,将内容粘贴修改即可)
修改对应的数据库名和文件路径。
具体见本文档下第3步详情。

4.设置环境变量:ORACLE_SID=yy
export ORACLE_SID=yy

5.建立二进制参数文件
conn / as sysdba
create spfile from pfile;

6.建立参数文件中描述的路径
cd /u01/app/oracle/admin
cp -r qq yy 进入到该目录下将qq目录复制重命名为yy
建立数据文件存放目录
cd /u01/app/oracle/oradata
mkdir yy
7.修改官方文档的手动建库脚本,改数据库名,路径,密码等。
具体见本文下面第7步详情

8.启动数据库到nomount,启动数据库到nomount阶段会写日志到$ORACLE_BASE/admin/实例名/adump目录
startup
报205错误
运行第7步修改后的 create database脚本创建数据库。
脚本执行完毕后数据库创建完成,建成一个裸库,没有数据字典

9.运行脚本: @$ORACLE_HOME/rdbms/admin/catalog 建立数据字典
@$ORACLE_HOME/rdbms/admin/catproc 建立应用的包

10.创建示例方案
SYS用户执行
alter user system identified by a;
conn system/a@$ORACLE_HOME/sqlplus/admin/pupbld
br/>@$ORACLE_HOME/sqlplus/admin/pupbld
@$ORACLE_HOME/rdbms/admin/utlsampl.sql

第3步详情:
.audit_file_dest='/u01/app/oracle/admin/yy/adump'
.audit_trail='db'
.compatible='11.2.0.0.0'
.control_files='/u01/app/oracle/oradata/yy/control01.ctl','/u01/app/oracle/oradata/yy/control02.ctl'
.db_block_size=8192
.db_domain=''
.db_name='yy'
.diagnostic_dest='/u01/app/oracle'
.open_cursors=300
.pga_aggregate_target=308281344
.processes=150
.remote_login_passwordfile='EXCLUSIVE'
.sga_target=924844032
.undo_tablespace='UNDOTBS1'

第7步详情:
CREATE DATABASE yy
USER SYS IDENTIFIED BY a
USER SYSTEM IDENTIFIED BY a
LOGFILE GROUP 1 ('/u01/app/oracle/oradata/yy/redo01.log') SIZE 20M,
GROUP 2 ('/u01/app/oracle/oradata/yy/redo02.log') SIZE 20M,
GROUP 3 ('/u01/app/oracle/oradata/yy/redo03.log') SIZE 20M
CHARACTER SET US7ASCII
NATIONAL CHARACTER SET AL16UTF16
EXTENT MANAGEMENT LOCAL
DATAFILE '/u01/app/oracle/oradata/yy/system01.dbf' SIZE 325M REUSE
SYSAUX DATAFILE '/u01/app/oracle/oradata/yy/sysaux01.dbf' SIZE 325M REUSE
DEFAULT TABLESPACE users
DATAFILE '/u01/app/oracle/oradata/yy/users01.dbf'
SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE tempts1
TEMPFILE '/u01/app/oracle/oradata/yy/temp01.dbf'
SIZE 20M REUSE
UNDO TABLESPACE undotbs1
DATAFILE '/u01/app/oracle/oradata/yy/undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;

实验2:掌握数据库启动3阶段
删除yy数据库的参数文件,将yy数据库的控制文件、数据文件、日志文件移动到其他位置。
原来的目录 $ORACLE_BASE/oradata/yy 新的目录:$ORACLE_BASE/oradata/tt
1.查看数据库位置
select name from v$datafile
union all
select name from v$controlfile
union all
select name from v$tempfile
union all
select member from v$logfile;

路径:/u01/app/oracle/oradata/tt/

2.关闭数据库
shutdown immediate;

3.删除数据库的参数文件,将数据库的数据文件、日志文件、控制文件移动到其他目录。
cd $ORACLE_HOME/dbs
rm -rf inityy.ora
rm -rf spfileyy.ora
cd $ORACLE_BASE/oradata
mv yy tt

4.指定实例名,启动数据库
startup
报错:ORA-01078找不到参数文件
根据 /u01/app/oracle/diag/rdbms/yy/yy/trace下的log文件创建新的参数文件。
cd $ORACLE_HOME/dbs
vi inityy.ora 将刚才所看log文件的以下部分粘贴到该文本中,保存退出。

processes = 150
sga_target = 884M
control_files = "/u01/app/oracle/oradata/yy/control01.ctl"
control_files = "/u01/app/oracle/oradata/yy/control02.ctl"
db_block_size = 8192
compatible = "11.2.0.0.0"
undo_tablespace = "UNDOTBS1"
remote_login_passwordfile= "EXCLUSIVE"
db_domain = ""
audit_file_dest = "/u01/app/oracle/admin/yy/adump"
audit_trail = "DB"
db_name = "yy"
open_cursors = 300
pga_aggregate_target = 294M
diagnostic_dest = "/u01/app/oracle"
注:该步骤说明在数据库启动到numount阶段就需要参数文件。

5.在第四步创建好文本参数文件后,以SYS身份连接到数据库,创建二进制参数文件,启动数据库。
export ORACLE_SID=yy
sqlplus / as sysdba
create spfile from pfile;
startup
报错:ORA-00205 控制文件错误
查看数据库的状态:数据库处于STARTED状态。
该步骤说明:在启动到nomount阶段时,只要参数文件无误即可。
在mount数据库时,需要用到控制文件。

6.修改参数文件中控制文件的位置:
alter system set control_files='/u01/app/oracle/oradata/tt/control01.ctl',
'/u01/app/oracle/oradata/tt/control02.ctl' scope=spfile;

7.上一步修改完成后关闭数据库,再次启动。
shutdown abort;
startup nomount; 成功
alter database mount; 成功
alter database opne; 报错
报错:ORA-01157不能找到数据文件,原因是数据文件已经被移动到其他路径。

8.修改数据库,重新指定数据库的数据文件的位置:(所有的数据文件和日志文件均要执行,可以写脚本来完成)
alter database rename file '/u01/app/oracle/oradata/tt/undotbs01.dbf'
to'/u01/app/oracle/oradata/yy/undotbs01.dbf';

9.重新指定路径成功后打开数据库
alter database open;

dump目录/u01/app/oracle/diag/rdbms/yy/yy/trace

修改参数control_files=新路径

启动数据库 mount成功 open报错

修改数据文件,临时文件,数据文件

/u01/app/oracle/oradata/rr/control01.ctl
/u01/app/oracle/oradata/rr/control01.ctl

select 'alter database rename file '''||name||''''||chr(10)||' to''' ||
replace(name,'tt','yy')||''';' from v$datafile
union all
select 'alter database rename file '''||name||''''||chr(10)||' to''' ||
replace(name,'tt','yy')||''';' from v$tempfile
union all
select 'alter database rename file '''||member||''''||chr(10)||' to''' ||
replace(member,'tt','yy')||''';' from v$logfile ;

select 'alter database rename file '''||name||''''||chr(10)||' to '''||
'/newdb'||substr(name,instr(name,'/',-1))||';' from v$datafile;

段 segment

范围 extend
一次分配的,连续的,ORACLE块
一个段最少有一个范围,可以有很多个范围
范围有3种模式
1.建立对象时,分配的叫做初始范围
2.数据增长时,分配额外的范围
3.手工分配范围

conn / as sysdba
grant select any dictionary to scott
conn scott/tiger
select from dba_free_space where tablespace_name='USERS';
2.create table t1 as select
from emp;
create table t2 as select from emp;
3.select extent_id,file_id,block_id,blocks from dba_extents
where segment_name='T1';
4.insert into t1 select
from t1;
insert into t2 select * from t2;
select extent_id,file_id,block_id,blocks from dba_extents
where segment_name='T1';

select extent_id,file_id,block_id,blocks from dba_extents
where segment_name='T2';

手动分配空间:
alter table t1 allocate extent; 不指定大小,系统根据表已有大小分配。
alter table t1 allocate extent(size 2G); 指定大小
块 block

SET LONG 1000
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','T2') FROM DUAL;

CREATE TABLE T1 SEGMENT CREATION IMMEDIATE AS SELECT * FROM EMP where 0=9;

SHOW PARAMETER SEGMENT

ALTER SYSTEM SET deferred_segment_creation=FALSE;

范围回收3模式
1.手工回收未使用的范围(崭新的)
alter table t1 allocate extent(size 10m);
alter table t1 deallocate unused;

tabs=user_tables

select table_name,initial_extent from tabs where table_name='T2';
create table t2 storage(initial 1m) as select * from emp;

2.truncate table t1;(保留初始范围)
3.drop table t1 purge;(彻底删除空间)

alter table t2 allocate extent(size 10m);

select extent_id,file_id,block_id,blocks from dba_extents
where segment_name='T2';

DELETE
1.DML
2.产生大量的回退
3.产生大量日志
4.可以rollback
5.手工commit;
6.不回收空间
7.不回收高水位
8.可以有条件删除

TRUNCATE
1.DDL
2.产生少的回退
3.产生少量日志
4.不可以rollback
5.自动commit;
6.回收空间
7.回收高水位
8.不可以有条件删除

show parameter rec
alter system set recyclebin=off scope=spfile;

块:
数据库存储的基本空间,默认是8K,建库时指定

rowid行标识
是根据数据存在的位置计算出来的
18位64进制字符串

AAASdN AAE AAAACr AAA
对象 文件 块 行

select rowid,ename,dbms_rowid.rowid_block_number(rowid) block# from emp;

ROWID_BLOCK_NUMBER
ROWID_OBJECT
ROWID_RELATIVE_FNO
ROWID_ROW_NUMBER

select rowid,ename,dbms_rowid.rowid_block_number(rowid) a,
dbms_rowid.ROWID_OBJECT(rowid) o,
dbms_rowid.ROWID_RELATIVE_FNO(rowid) f,
dbms_rowid.ROWID_ROW_NUMBER(rowid) r from emp;

select dbms_rowid.rowid_create(0,75335,4,151,0),
dbms_rowid.rowid_create(1,75335,4,151,0) from dual;

conn scott/123456;
drop table t1 purge;
create table t1 as select from emp;
insert into t1 select
from emp where deptno=10;
commit;
select ename,sal from t1 order by 1;
delete from t1 wai where rowid<(select max(rowid) from t1 nei where wai.ename=nei.ename);

ERROR:
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925
ORA-01075: you are currently logged on



回复

使用道具 举报