Oracle常用命令
Oracle常用的维护命令
1 表空间
1.1 创建表空间
extent management 有两种方式:extent management local(本地管理),extent management dictionary(数据字典管理),默认的是local
SQL> create tablespace bwcx datafile '/data/oracle/oradata/orcl/bwcx1.dbf' size 1G autoextend on next 256M;扩展表空间 后期使用
SQL> alter tablespace bwcx add datafile '/data/oracle/oradata/orcl/bwcx2.dbf' size 1G autoextend on next 256M;创建临时表空间
SQL> create temporary tablespace bwcx_t tempfile '/data/oracle/oradata/orcl/bwcx_t1.dbf' size 1G autoextend on next 256M;1.2 查询表空间
SQL> select * from dba_tablespaces;
SQL> select * from user_tablespaces;查询用户使用的表空间及临时表空间
SQL> select username,default_tablespace,temporary_tablespace from dba_users;
SQL> select username,default_tablespace,temporary_tablespace from user_users;
SQL> select username,default_tablespace,temporary_tablespace from dba_users where username='TEST_USER';
--
SELECT
dba_users.USERNAME,
dba_users.ACCOUNT_STATUS,
dba_data_files.tablespace_name AS default_tablespace,
dba_data_files.file_name AS data_file,
CASE
WHEN dba_data_files.bytes IS NULL THEN NULL
WHEN dba_data_files.bytes < 1024 THEN dba_data_files.bytes || ' B'
WHEN dba_data_files.bytes < 1024 * 1024 THEN ROUND(dba_data_files.bytes/1024, 2) || ' KB'
WHEN dba_data_files.bytes < 1024 * 1024 * 1024 THEN ROUND(dba_data_files.bytes/1024/1024, 2) || ' MB'
ELSE ROUND(dba_data_files.bytes/1024/1024/1024, 2) || ' GB'
END AS data_file_size,
dba_temp_files.tablespace_name AS temp_tablespace,
dba_temp_files.file_name AS temp_file,
CASE
WHEN dba_temp_files.bytes IS NULL THEN NULL
WHEN dba_temp_files.bytes < 1024 THEN dba_temp_files.bytes || ' B'
WHEN dba_temp_files.bytes < 1024 * 1024 THEN ROUND(dba_temp_files.bytes/1024, 2) || ' KB'
WHEN dba_temp_files.bytes < 1024 * 1024 * 1024 THEN ROUND(dba_temp_files.bytes/1024/1024, 2) || ' MB'
ELSE ROUND(dba_temp_files.bytes/1024/1024/1024, 2) || ' GB'
END AS temp_file_size
FROM dba_users
LEFT JOIN dba_data_files ON dba_users.DEFAULT_TABLESPACE = dba_data_files.tablespace_name
LEFT JOIN dba_temp_files ON dba_users.TEMPORARY_TABLESPACE = dba_temp_files.tablespace_name
order by dba_users.USERNAME;查询表空间数据文件路径
SQL> select tablespace_name,file_name,bytes from dba_data_files;
SQL> select tablespace_name,file_name,bytes from dba_data_files where tablespace_name ='BWCX';查询临时表空间数据文件路径
SQL> select tablespace_name,file_name,bytes from dba_temp_files;查看表空间大小
SELECT
d.tablespace_name tbsname,
round(d.tablespace_size*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024, 2) total_mb,
round(d.used_space*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024, 2) used_mb,
round((d.tablespace_size-d.used_space)*(SELECT value FROM v$parameter WHERE name='db_block_size')/1024/1024, 2) left_mb,
round(d.used_percent, 2) used_percent,
(SELECT MAX(autoextensible) FROM dba_data_files WHERE tablespace_name=d.tablespace_name) autoextensible,
(SELECT COUNT(file_name) FROM dba_data_files WHERE tablespace_name=d.tablespace_name) count_file
FROM
dba_tablespace_usage_metrics d
WHERE
d.tablespace_name NOT IN (
SELECT tablespace_name FROM dba_tablespaces
WHERE contents = 'TEMPORARY' OR contents = 'UNDO'
)
ORDER BY 2 DESC;1.3 删除表空间
SQL> drop tablespace bwcx_d including datafiles;
SQL> drop tablespace bwcx_d including contents and datafiles;
SQL> drop tablespace bwcx_d including contents and datafiles cascade constraint;including contents #删除表空间及对象;
including contents and datafiles #删除表空间、对象及数据文件;
including contents cascade constraint #删除关联;
including contents and datafiles cascade constraint #含前两项。
删除临时表空间
在某些情况下,当完成了大量的数据操作后,临时表空间可能不会立即释放。这时,你可以创建一个新的临时表空间,然后将默认的临时表空间切换到新的临时表空间,再删除原来的临时表空间。
创建一个新的临时表空间
SQL> CREATE TEMPORARY TABLESPACE temp_new TEMPFILE '/opt/oracle/oradata/orcl/temp_new01.dbf' SIZE 1G AUTOEXTEND ON;把一个用户的临时表空间更改为新的表空间
SQL> ALTER USER test_user TEMPORARY TABLESPACE temp_new;删除原有的临时表空间,在执行这个命令之前,请确保没有任何用户或进程正在使用旧的临时表空间
SQL> drop tablespace bwcx_t including contents and datafiles;检查旧的临时表空间是否仍然被占用
SELECT s.sid, s.username, s.program FROM v$session s JOIN v$tempseg_usage t ON s.saddr = t.session_addr WHERE t.tablespace = '旧的临时表空间名称';2 Segments
数据库存储对象的物理存储单位
| Segment 类型 | 含义 |
|---|---|
| TABLE | 表数据段 |
| INDEX | 索引段 |
| LOBSEGMENT | LOB 数据段(CLOB/BLOB) |
| LOBINDEX | LOB 索引段 |
| TABLE PARTITION | 分区表段 |
| INDEX PARTITION | 分区索引段 |
| … | 其他段类型 |
2.1 查询表(TABLE)的大小
-- dba 级
SELECT s.tablespace_name,
s.OWNER,
s.segment_name AS table_name,
SUM(s.bytes) / 1024 / 1024 AS mb
FROM dba_segments s
WHERE s.segment_type = 'TABLE'
GROUP BY s.OWNER, s.tablespace_name, s.segment_name
ORDER BY mb DESC;
-- 用户级
SELECT
s.segment_name AS table_name,
SUM(s.bytes)/1024/1024 AS mb
FROM user_segments s
WHERE s.segment_type = 'TABLE'
GROUP BY s.segment_name
ORDER BY mb DESC;2.2 查询索引(INDEX)大小
-- dba 级
SELECT
idx.TABLESPACE_NAME,
idx.OWNER,
idx.table_name,
idx.index_name,
SUM(s.bytes)/1024/1024 AS mb
FROM dba_segments s
JOIN dba_indexes idx
ON s.segment_name = idx.index_name
WHERE s.segment_type = 'INDEX'
GROUP BY idx.TABLESPACE_NAME, idx.OWNER, idx.table_name, idx.index_name
ORDER BY mb DESC;
-- 用户级
SELECT
idx.table_name,
idx.index_name,
SUM(s.bytes)/1024/1024 AS mb
FROM user_segments s
JOIN user_indexes idx
ON s.segment_name = idx.index_name
WHERE s.segment_type = 'INDEX'
GROUP BY idx.table_name, idx.index_name
ORDER BY mb DESC;2.3 查询 LOB / LOBINDEX(LOB 数据)大小
2.3.1 LOB 段(LOBSEGMENT)
-- dba级
SELECT
l.TABLESPACE_NAME,
l.OWNER,
l.table_name,
l.column_name,
l.segment_name AS lob_segment,
SUM(s.bytes)/1024/1024 AS mb
FROM dba_lobs l
JOIN dba_segments s
ON l.segment_name = s.segment_name
WHERE s.segment_type = 'LOBSEGMENT'
GROUP BY l.TABLESPACE_NAME, l.OWNER, l.table_name, l.column_name, l.segment_name
ORDER BY mb DESC;
-- 用户级
SELECT
l.table_name,
l.column_name,
l.segment_name AS lob_segment,
SUM(s.bytes)/1024/1024 AS mb
FROM user_lobs l
JOIN user_segments s
ON l.segment_name = s.segment_name
WHERE s.segment_type = 'LOBSEGMENT'
GROUP BY l.table_name, l.column_name, l.segment_name
ORDER BY mb DESC;2.3.2 LOB 索引段(LOBINDEX)
-- dba级
SELECT
l.TABLESPACE_NAME,
l.OWNER,
l.table_name,
l.column_name,
l.index_name AS lob_index_name,
SUM(s.bytes)/1024/1024 AS mb
FROM dba_lobs l
JOIN dba_segments s
ON l.index_name = s.segment_name
WHERE s.segment_type = 'LOBINDEX'
GROUP BY l.TABLESPACE_NAME, l.OWNER, l.table_name, l.column_name, l.index_name
ORDER BY mb DESC;
-- 用户级
SELECT
l.table_name,
l.column_name,
l.index_name AS lob_index_name,
SUM(s.bytes)/1024/1024 AS mb
FROM user_lobs l
JOIN user_segments s
ON l.index_name = s.segment_name
WHERE s.segment_type = 'LOBINDEX'
GROUP BY l.table_name, l.column_name, l.index_name
ORDER BY mb DESC;3 用户
3.1 查询用户
SQL> select username,account_status from dba_users;3.2 创建用户
SQL> create user 用户名 identified by "密码" default tablespace 表空间 temporary tablespace 临时表空间;3.3 修改密码
SQL> alter user TEST_USER identified by "newpassword";带特殊字符时,如果出现提示enter value for xxx
SQL> set define off
SQL> alter user TEST_USER identified by "newpassword";3.4 删除用户
SQL> drop user 用户名 cascade;3.5 修改用户表空间
修改用户默认表空间
SQL> alter user test default tablespace test1;修改用户临时表空间
SQL> alter user test temporary tablespace test_t1;3.6 权限
参考:GRANT
3.6.1 角色查询
select * from dba_roles;常用角色就三个:
CONNECTRESOURCEDBA
3.6.2 角色拥有的权限
select * from DBA_SYS_PRIVS where GRANTEE='RESOURCE';3.6.3 授权用户
SQL> grant connect,resource to 用户名;
SQL> grant unlimited tablespace to 用户名;
SQL> grant create view to 用户名;
SQL> grant create job to 用户名;
SQL> grant create public database link to 用户名;
SQL> grant create session to 用户名;
SQL> grant select on 表名 to 用户名;
SQL> grant insert on 表名 to 用户名;
SQL> grant update on 表名 to 用户名;
SQL> grant select,insert,update,delete,all on 表名 to 用户名;
# 所有表查询(dba权限执行)
SQL> grant select any table to reader;3.6.4 撤销授权
SQL> revoke connect from reader;
SQL> revoke select on wcpt_pt_pay_pre from reader;
SQL> revoke select any table from reader;3.6.5 查询用户权限
查询用户拥有的角色
select * from user_role_privs;查询用户拥有的权限
select * from user_sys_privs;赋予权限
grant 权限 to user_name;
grant 角色 to user_name;撤回权限
revoke 权限 from user_name;创建角色
create role role_name给权限赋予权限
grant create session to role_name;
grant select, insert, delete, update to role_name;查询角色拥有的权限
select * from dba_sys_privs where grantee='resource';4 约束
| 约束类型 | Type Code | 规范命名 | 名称说明 |
|---|---|---|---|
| 主键约束 | P | PK_表名_列名 | Primary Key |
| 外键约束 | R | FK_表名_列名 | Foreign Key |
| 非空约束 | NN_表名_列名 | Not Null | |
| 唯一约束 | U | UK_表名_列名 | Unique Key |
| 检查约束 | C | CK_表名_列名 | Check |
4.1 查询约束
-- 常用视图 (权限由大到小: dba_* > all_* > user_*)
-- dba_constraints:侧重约束具体信息
-- dba_cons_columns:侧重约束列信息
-- user_constraints:当前用户模式下创建的对象
-- all_constraints:当前用户模式下创建的对象加上当前用户能访问的其他用户创建的对象
-- 参考如下:
select * from dba_constraints;
select * from user_constraints;
select * from all_constraints;
select * from dba_cons_columns;
select * from user_cons_columns;
select * from all_cons_columns;根据表查询约束
select * from user_constraints where table_name='TEST';根据约束查询表
select * from all_constraints where constraint_name='SYS_C001011964'4.2 创建约束
-- 1.唯一性约束
alter table 表名 add constraint uk_* unique(列名) [not null];
-- 2.检查约束
alter table 表名 add constraint ck_* check(列名 between 1 and 100);
alter table 表名 add constraint ck_* check(列名 in ('值1', '值n'));
-- 3.非空约束(多个约束中,not null 位于末尾)
alter table 表名 modify(列名 constraint nk_* not null);4.3 删除约束
alter table 表名 drop constraint 约束名;
参考:
alter table TEST_USER.TABLE_USER drop constraint SYS_C0014437;4.4 重命名约束
alter table 表名 rename constraint 约束名 to new_约束名;4.5 禁用启用约束
-- 1.禁用 disable
alter table 表名 disable constraint 约束名 [cascade];
-- 2.启用 enable
alter table 表名 enable constraint 约束名 [cascade];5 索引
5.1 索引类型
B-treeB树索引
Bitmap位图索引
REVERSE反向索引
HASHHASH索引
Function-based基于函数的索引
Partitioned/NonPartitioned分区索引/非分区索引
Domain域索引
5.2 查询索引
-- dba_ind_columns:索引对应哪些列
-- dba_indexes:所有索引
-- 与约束类似
-- 参考命令:
select * from dba_indexes;
select * from all_indexes;
select * from user_indexes;
select * from dba_ind_columns;5.3 创建索引
-- 普通索引
create index 索引名 on 表名(列名);
-- 唯一索引
create unique index <index_name> on <table_name>(<coiumn_name>);
-- 位图索引
create bitmap index <index_name> on <table_name>(<column_name>);
-- 组合索引
create index 索引名 on 表名(列名1,,列名2);5.4 删除索引
drop index 索引名;5.5 修改索引
-- 修改索引名称
alter index <index_name> rename to <index_new_name>;
-- 修改索引为无效
alter index <index_name> unusable;
-- 重建索引
alter index <index_name> rebuild online;6 Dblink
创建PUBLIC DATABASE LINK
CREATE PUBLIC DATABASE LINK dblink名称 CONNECT TO tms_user IDENTIFIED BY "password" USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';删除
drop public database link dblink名称创建DATABASE LINK
CREATE DATABASE LINK dblink名称 CONNECT TO tms_user IDENTIFIED BY "password" USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';删除
drop database link dblink名称7 修改密码不过期
SQL> alter profile default limit password_life_time unlimited;8 directory操作
查询directory
SQL> select * from dba_directories;创建directory
SQL> create [or replace] directory bwcx_dump as '/databak/bwcxdata/dmp/';删除directory
SQL> drop directory bwcx_dump;授权默认directory(使用Oracle默认的directory)
SQL> grant read, write on directory DATA_PUMP_DIR to bwcx_user;授权directory给用户访问
SQL> grant read, write on directory bwcx_dump to bwcx_user;9 expdp导出
9.1 常用的过滤SQL表达式
EXCLUDE与INCLUDE规则相同,使用方法一致
过滤单个表对象,写在命令行上需要加转义符
EXCLUDE=TABLE:"= 'EMP'"
转义后
EXCLUDE=TABLE:\"= \'EMP\'\"过滤多个表对象
EXCLUDE=TABLE:"IN('SYSTEM_LOG','SYSTEM_BUS_LOG')
转义后
EXCLUDE=TABLE:\"IN\(\'SYSTEM_LOG\',\'SYSTEM_BUS_LOG\'\)\"模糊匹配
EXCLUDE=TABLE:"LIKE 'TMS%'"
转义后
EXCLUDE=TABLE:\"LIKE\ \'TMS%\'\"如果需要过滤多个表的数据,那么如果用命令方式写,因为需要转译,是很麻烦的,也容易出错,这时我们可以使用 parfile 文件来避免大量的转译
cat parfile.txt
exclude=statistics
exclude=table:"in ('OMS_TO_TMS_LOG','SYSTEM_FEE_LOG','SYSTEM_LOG','TMS_APP_TASK_ORDER_PAYD','TMS_CASHIER_JOURNAL','TMS_FULL_PROCESS_IMPORT','TMS_INVOICE_RECEIVED','TMS_INVOICE_SHIP','TMS_OA_ASSET_CAR','TMS_OA_ASSET_DRIVER','TMS_OA_PAYABLE_APPLY_ITEM','TMS_OA_PAYABLE_APPLY_REMAIN','TMS_ORDER_SHIP_B0923','TMS_R_GROSS_PROFIT_BYMONTH','TMS_REPORT_CASHIER_RECEIPT','TMS_REPORT_COST','TMS_REPORT_INCOME','TMS_REPORT_INCOME_COST','TMS_REPORT_INCOME_COST2','TMS_REPORT_PAY','TMS_REPORT_SALES','TMS_REPORT_TRANS','TMS_TRANS_TRANSPORT_PD_221226')"
exclude=table:"like 'API%'"
exclude=table:"like 'MDM%'"
exclude=table:"like 'WCPT%'"parfile 与命令行可以组合使用
示例
expdp ${user}/${passwd} \
directory=DATA_PUMP_DIR \
schemas=${user} \
filesize=2048M \
parallel=4 \
dumpfile=back_${date}_%U.dmp \
compression=all \
parfile=$(dirname "$0")/parfile.txt
参数说明:
filesize # 单个DUMP文件的最大容量
parallel # 并行度
dumpfile # 如使用变量 %U ,impdp时也需使用此变量10 impdp导入
impdp ${dbuser}/${dbpasswd} \
directory=DATA_PUMP_DIR \
dumpfile=${filename} \
remap_tablespace=bwcx:bwcx1 \
remap_schema=bwcx_user:bwcx_user1 \
exclude=statistics \
table_exists_action=replace \
transform=segment_attributes:n
参数说明:
remap_tablespace #将表空间对象重新映射到另一个表空间
remap_schema #将一个用户的的数据迁移到另外一个用户
exclude=statistics #排除统计值
table_exists_action=replace #删除已存在表,重新建表并追加数据
transform=segment_attributes:n #TRANSFORM适用场景,导入和导出的时候,有些表空间不一样。segment_attributes Y:默认值,表示这个段的属性(物理属性,存储属性,表空间和logging)都将被包含在DDL的语句中。N:表示导入该对象的时候,不会指定表空间等属性,只是简单的创建一个对象。导入指定表
impdp ${dbuser}/${dbpasswd} \
directory=DATA_PUMP_DIR \
dumpfile=expdp.dmp \
tables=bwcx_user.table1,bwcx_user.table2 \
remap_schema=bwcx_user:bwcx_user1 \
table_exists_action=replace \
transform=segment_attributes:noffline(关闭)表空间
SQL> alter tablespace bwcx_d offline;online(打开)表空间
SQL> alter tablespace bwcx_d online;Oracle表数据从快照区恢复
SQL> select * from abc as of timestamp to_timestamp('2020-01-14 19:00:00','yyyy-mm-dd hh24:mi:ss');输出每页行数,缺省为24,为了避免分页,可设定为0。
SQL> set pagesize 0输出一行字符个数,缺省为80
SQL> set linesize 500