一、表空间概念
表空间是一个逻辑概念,数据库对象(表,视图,索引等)必须存储在某个表空间中,表空间对应着若干数据文件。
一个数据库可以有多个表空间,一个表空间只能属于一个数据库
一个表空间包含多个数据文件,一个数据文件只能属于一个表空间
多个用户可以共用一个表空间
表空间类型:
1、永久表空间:
2、临时表空间
3、undo表空间
oracle默认已存在多个表空间:
SQL> select * from v$tablespace; 查看有哪些表空间
SYSTEM |
系统表空间,存放ORACLE数据库的数据字典,损坏会导致数据无法打开 |
SYSAUX |
SYSTEM的辅助表空间,存储除数据字典以外的数据对象 |
UNDOTBS1 |
存储撤销数据的表空间,保存数据在修改之前的值,用于事务回滚,实例恢复 |
TEMP |
临时表空间,存放SQL的排序、分组等操作信息 |
USERS |
存储用户数据 |
查看表空间所对应的数据文件:
SQL> select tablespace_name,file_name from dba_data_files;
二、表空间管理
2.1 创建表空间
语法:
CREATE [temporary | undo ] TABLESPACE 表空间名 DATAFILE '数据文件路径' SIZE 大小 [AUTOEXTEND ON] [NEXT 大小] [MAXSIZE 大小]; |
[temporary | undo ] : 表空间类型,temporary为临时表空间,undo为undo表空间,不指定默认为永久表空间
SIZE: 表空间的初始大小 (表空间存满后无法写入)
AUTOEXTEND: 表空间大小是否自动扩展,ON开启扩展,OFF关闭扩展,默认为OFF
NEXT: 每次扩展的大小
SQL> CREATE TABLESPACE test_tbs01 DATAFILE '/data/db_data/ORCL19/datafile/test_tbs01.dbf' SIZE 100M AUTOEXTEND ON |
2.2 使用表空间
创建用户时为用户分配表空间:
SQL> CREATE USER testuser01 identified by 123456 DEFAULT TABLESPACE test_tbs01; |
CDB中,用户的默认表空间是USERS
PDB 中,用户的默认表空间是SYSTEM
修改用户默认表空间
alter user UserName default tablespace TablespaceNme
SQL> select username,default_tablespace from dba_users where username='USER1'; USERNAME DEFAULT_TABLESPACE -------------------- ------------------------------ USER1 SYSTEM SQL> alter user user1 default tablespace PDB02_TBS01; User altered. SQL> select username,default_tablespace from dba_users where username='USER1'; USERNAME DEFAULT_TABLESPACE -------------------- ------------------------------ USER1 PDB02_TBS01 |
创建表时指定表空间:
SQL> create table Test_tab01 (id char(4) not null, name varchar2(30) not null) tablespace test_tbs02; |
********
在CDB中,为公共用户分配表空间时,所分配的表空间必须在PDB和CDB中同时存在,否则会报错。因为在CDB中创建的用户是公共用户,该用户会传递到PDB中,给公共用户分配表空间时,会在所有PDB中都进行此操作,而PDB中并无相应表空间,所以会报错。
SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL> create user c##user1 identified by 123456; User created. SQL> create tablespace tbs_test1 datafile '/data/u01/app/oracle/oradata/ORCL/tbs_test1_1.dbf' size 10M autoextend on; Tablespace created. SQL> alter user c##user1 default tablespace tbs_test1; alter user c##user1 default tablespace tbs_test1 * ERROR at line 1: ORA-65048: error encountered when processing the current DDL statement in pluggable database ORCLPDB ORA-00959: tablespace 'TBS_TEST1' does not exist |
2.3 修改表空间
修改表空间状态
SQL> alter tablespace test_tbs02; offline; //将表空间离线 SQL> alter tablespace test_tbs02; online; //将表空间设置为在线 SQL> alter tablespace test_tbs02 read only; //将表空间设置为只读 SQL> alter tablespace test_tbs02 read write; //将表空间设置为读写 |
向表空间中添加数据文件
alter tablesapce 表空间名 add datafile '数据文件名' size 大小 [reuse] [autoextend [on/off] next 大小] [maxsize [unlimited|大小]]; |
reuse: 如果操作系统已存在数据文件会覆盖 ,不加reuse则会报错提示,默认不加
maxsize [unlimited|大小]: 如果开启数据文件自动扩展,则最大可以扩展到多少,unlimited表示不限制。
SQL> alter tablespace test_tbs01 add datafile '/data/db_data/ORCL19/datafile/test_tbs01_1.dbf' size 100M autoextend off; |
修改数据文件(大小,自动扩展等)
alter database datafile '数据文件名' [ [resize 大小| [autoextend [on/off] next 大小] [maxsize [unlimited|大小]] ]; |
resize: 修改数据文件大小,必须大于已使用的空间
SQL> alter database datafile '/data/db_data/ORCL19/datafile/test_tbs01.dbf' resize 200M ; |
2.4 删除表空间
删除表空间、表空间内的数据对象和数据文件
drop tablespace 表空间名 including contents and datafiles; |
SQL> drop tablespace test_tbs02 including contents and datafiles; |
三、数据文件管理
数据文件迁移:
1)把表空间offline。
SQL> alter tablespace DATA offline;
2)在操作系统上迁移数据文件
# mv data01.dbf data03.dbf
3)执行alter tablespace或alter database修改数据库文件名。
alter tablespace DATA rename datafile '/oracle/base/oradata/snorcl11g/data01.dbf' to '/oracle/base/oradata/snorcl11g/data02.dbf';
4)把表空间online。
alter tablespace DATA online;
四、表空间及数据文件查询
1、查看当前用户的默认表空间
SQL> select username,default_tablespace from user_users; |
2、查看数据文件相关信息
SQL> select file_name,file_id,tablespace_name,bytes,status,autoextensible, maxbytes,user_bytes,online_status from DBA_DATA_FILES order by tablespace_name,file_name; |