Oracle DBA日常维护的SQL脚本(常用SQL)

0    592    3

Tags:

👉 本文共约6906个字,系统预计阅读时间或需26分钟。

本页目录 隐藏

查看PSU

根据文件号和块号查询数据库对象

元数据获取(表空间、用户、权限)

查询表的历史统计信息

查询索引的历史统计信息

表上列的使用情况

查询字符集

生成AWR

AWR的SQL部分

AWR信息

AWR主机信息

查询碎片程度高的表

条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的block大小了,见create table storged的NEXT参数),5个block相对于几行小表数据来说就相差太大了。

算法中/0.9是因为块的pfree一般为10%,所以一个块最多只用了90%,而且一行数据大于8KB时容易产生行链接,把一行分片存储,一样的一个块连90%都用不满、

AVG_ROW_LEN还是比较准的,比如个人实验情况一表6个字段,一个number,其他5个都是char(100)但是实际数据都是’1111111’7位,AVG_ROW_LEN显示依然为513

查询索引碎片的比例

集群因子clustering_factor高的表

集群因子越接近块数越好,接近行数则说明索引列的列值相等的行分布极度散列,可能不走索引扫描而走全表扫描

根据sid查spid或根据spid查sid

根据sid查看具体的sql语句

根据spid查询具体的sql语句

查看历史session_id的SQL来自哪个IP

(当然这是个误解,都是历史的了,怎么可能还查到spid,其实查看trace文件名就可以知道spid,trace文件里面有sid和具体sql,如果trace存在incident,那trace就看不到具体sql,但是可以在incident文件中看到具体的sql,如DW_ora_17751.trc中17751就是spid,里面有这样的内容Incident 115 created, dump file: /XX/incident/incdir_115/DW_ora_17751_i115.trc,那么在DW_ora_17751_i115.trc就可以看到具体的sql语句)

DB_ora_29349.trc中出现如下

*** SESSION ID:(5057.12807) 2016-10-26 14:45:52.726

通过表V$ACTIVE_SESSION_HISTORY来查,如下

查询上面的machine的IP是多少

通过上面的spid在oracle服务器上执行netstat -anp |grep spid即可

出现两个,说明来自220,连接了228数据库服务器,但是又通过228服务器的dblink去连接了16服务器

查询DML死锁会话sid,及引起死锁的堵塞者会话blocking_session

BLOCKING_SESSION:Session identifier of the blocking session. This column is valid only if BLOCKING_SESSION_STATUS has the value VALID.

可以在v$session.LOGON_TIME上看到引起死锁的堵塞者会话比等待者要早

如果遇到RAC环境,一定要用gv$来查,并且执行alter system kill session 'sid,serial#'要到RAC对应的实例上去执行

或如下也可以

查询DDL锁的sql

结果为671 0 3 2011-11-1 12:00:00

525 2 0 2011-11-4 12:00:00

查询锁住的DDL对象

查询当前正在执行的sql

查询正在执行的SCHEDULER_JOB

查询正在执行的dbms_job

查询一个会话session、process平均消耗多少内存,查看下面avg_used_M值

TOP 10 执行次数排序

TOP 10 物理读排序

(不要使用DISK_READS/ EXECUTIONS来排序,因为任何一条语句不管执行几次都会耗逻辑读和cpu,可能不会耗物理读(遇到LRU还会耗物理读,LRU规则是执行最不频繁的且最后一次执行时间距离现在最久远的就会被交互出buffer cache),是因为buffer cache存放的是数据块,去数据块里找行一定会消耗cpu和逻辑读的。Shared pool执行存放sql的解析结果,sql执行的时候只是去share pool中找hash value,如果有匹配的就是软解析。所以物理读逻辑读是在buffer cache中,软解析硬解析是在shared pool)

TOP 10 逻辑读排序

(不要使用BUFFER_GETS/ EXECUTIONS来排序,原因同16)

TOP 10 CPU排序

(不要使用CPU_TIME/ EXECUTIONS来排序,原因同16)

查询等待事件

查询当前正在消耗temp空间的sql语句

查询需要使用绑定变量的sql,10G以后推荐第二种

(任何一条执行过的语句不管执行了几次在V$SQL中都只有一条记录,V$SQL中会记录执行了几次。两条一模一样的语句但是在不同的schema下执行的两种结果,如select from t1.test在sye、system下执行则V$SQL只有一条记录(谁先执行则PARSING_SCHEMA_NAME显示谁)。如在sys和system都执行select from test则V$SQL中有两条记录,两条记录的CHILD_NUMBER和PARSING_SCHEMA_NAME不一样。同一个用户下执行一样的语句如果大小写不一样或加了hint的话则会出现多个V$SQL记录,说明V$SQL对应的sql语句必须一模一样,如果alter system flush shared_pool(主站慎用)后再执行一样的语句,发现语句在V$SQL中的SQL_ID和HASH_VALUE与之前的一样,说明SQL_ID和HASH_VALUE应该是oracle自己的一套算法来的,只是根据sql语句内容来进行转换,sql语句不变则SQL_ID和HASH_VALUE也不变。)

第一种

第二种

count(1)>10表示类语句运行了10次以上

查看数据文件可用百分比

查看数据文件可用百分比

查看表空间可用百分比

查看临时表空间使用率

查询undo表空间使用情况

查看ASM磁盘组使用率

统计每个用户使用表空间率

查看闪回区\快速恢复区空间使用率

查看僵死进程,分两种

alter system kill session一执行则session即标记为KILLED,但是如果会话产生的数据量大则这个kill可能会比较久,在这个过程中session标记为KILLED但是这个会话还在V$session中,则V$session.paddr还在,所以可以匹配到V$process.addr,所以process进程还在;当kill过程执行完毕,则这个会话即不在V$session中

会话不在的

会话还在的,但是会话标记为killed

再根据上述结果中的SPID通过如下命令可以查看到process的启动时间

查看行迁移或行链接的表

chain_cnt :Number of rows in the table that are chained from one data block to another or that have migrated to a new block, requiring a link to preserve the old rowid. This column is updated only after you analyze the table.

数据缓冲区命中率

共享池命中率

以下两者应该都可以,看个人怎么理解

查询归档日志切换频率

查询lgwr进程写日志时每执行一次lgwr需要多少秒

在state是waiting的情况下,某个等待编号seq#下,seconds_in_wait达多少秒,就是lgwr进程写一次IO需要多少秒

查询没有索引的表

查询7天的db time

查询产生热块较多的对象

x$bh .tch(Touch)表示访问次数越高,热点快竞争问题就存在

导出AWR报告的SQL语句

查询某个SQL的执行计划

含顺序的

不过要先创建xplan包,再执行

在 Oracle 中生成随机数值

这是 Oracle 普通的旧的随机数值生成器。这个可以生成 0-100 之间的随机数值,如果你想自己设置数值范围,那么改变乘数就可以了。
--generate random number between 0 and 100

检查表中是否含有任何的数据

这个可以有很多中写法,你可以使用 count(*) 来查看表里的行的数量,但是这个查询语句比较高效和快速,而且我们只是想知道表里是否有任何的数据。

把数值转换成文字

输出
one thousand five hundred twenty-six

在包的源代码中查询字符串

这个查询语句会在所有包的源代码上搜索‘FOO_SOMETHING’ ,可以帮助用户在源代码中查找特定的存储过程或者是函数调用。

search a string foo_something in package source code

把用逗号分隔的数据插入的表中

当你想把用逗号分隔开的字符串插入表中的时候,你可以使用其他的查询语句,比如 IN 或者是 NOT IN 。这里我们把‘AA,BB,CC,DD,EE,FF’转换成包含 AA,BB,CC 等作为一行的表,这样你就很容易把这些字符串插入到其他表中,并快速的做一些相关的操作。

查询表中的最后一个记录

这个查询语句很直接,表中没有主键,或者是用户不确定记录最大主键是否是最新的那个记录时,就可以使用这个语句来查询表中最后一个记录。

在 Oracle 中做行数据乘法

这个查询语句使用一些复杂的数学函数来做每个行的数值乘法

获取当前月份的第一天

运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取当前月份的最后一天

这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取当前年份的第一天

每年的第一天都是1 月1日,这个查询语句可以使用在存储过程中,需要对当前年份第一天做一些计算的时候。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取当前年份的最后一天

类似于上面的查询语句。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取当前月份的天数

这个语句非常有用,可以计算出当前月份的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取当前月份剩下的天数

下面的语句用来计算当前月份剩下的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取两个日期之间的天数

使用这个语句来获取两个不同日期自检的天数。

显示当前年份截止到上个月每个月份开始和结束的日期

这个是个很聪明的查询语句,用来显示当前年份每个月的开始和结束的日期,你可以使用这个进行一些类型的计算。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。

获取直到目前为止今天过去的秒数(从 00:00 开始算)

获取今天剩下的秒数(直到 23:59:59 结束)

检查在当前数据库模式下是否存在指定的表

这是一个简单的查询语句,用来检查当前数据库是否有你想要创建的表,允许你重新运行创建表脚本,这个也可以检查当前用户是否已经创建了指定的表(根据这个查询语句在什么环境下运行来查询)。

检查在当前表中是否存在指定的列

这是个简单的查询语句来检查表里是否有指定的列,在你尝试使用 ALTER TABLE 来添加新的列新到表中的时候非常有用,它会提示你是否已经存在这个列。

显示表结构

这个查询语句会显示任何表的 DDL 状态信息。请注意我们已经将‘TABLE’作为第一个信息提交了。这个查询语句也可以用来获取任何数据库对象的 DDL 状态信息。举例说明,只需要把第一个参数替换成‘VIEW’,第二个修改成视图的名字,就可以查询视图的 DDL 信息了。

获取当前模式

这是另一个可以获得当前模式的名字的查询语句。

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

修改当前模式

这是另一个可以修改当前模式的查询语句,当你希望你的脚本可以在指定的用户下运行的时候非常有用,而且这是非常安全的一个方式。

数据库版本信息

返回 Oracle 数据库版本

数据库默认信息

返回一些系统默认的信息

数据库字符设置信息

显示数据库的字符设置信息

获取 Oracle 版本

存储区分大小写的数据,但是索引不区分大小写

某些时候你可能想在数据库中查询一些独立的数据,可能会用 UPPER(..) = UPPER(..) 来进行不区分大小写的查询,所以就想让索引不区分大小写,不占用那么多的空间,这个语句恰好能解决你的需求 。

调整没有添加数据文件的表空间

另一个 DDL 查询来调整表空间大小

检查表空间的自动扩展开关

在给定的表空间中查询是否打开了自动扩展开关

在表空间添加数据文件

在表空间中添加数据文件

增加数据文件的大小

给指定的表空间增加大小

查询数据库的实际大小

给出以 GB 为单位的数据库的实际大小

查询数据库中数据占用的大小或者是数据库使用细节

给出在数据库中数据占据的空间大小

查询模式或者用户的大小

以 MB 为单位给出用户的空间大小

查询数据库中每个用户最后使用的 SQL 查询

此查询语句会显示当前数据库中每个用户最后使用的 SQL 语句。

查询用户 CPU 的使用率

这个语句是用来显示每个用户的 CPU 使用率,有助于用户理解数据库负载情况

查询数据库长查询进展情况

显示运行中的长查询的进展情况

获取当前会话 ID,进程 ID,客户端 ID 等

这个专门提供给想使用进程 ID 和 会话 ID 做些 voodoo magic 的用户。

  • V$SESSION.SID AND V$SESSION.SERIAL# 是数据库进程 ID
  • V$PROCESS.SPID 是数据库服务器后台进程 ID
  • V$SESSION.PROCESS 是客户端 PROCESS ID, ON windows it IS : separated THE FIRST # IS THE PROCESS ID ON THE client AND 2nd one IS THE THREAD id.

查询特定的模式或者表中执行的最后一个 SQL 语句

查询每个执行读取的前十个 SQL

在视图中查询并显示实际的 Oracle 连接

查询并显示通过打开连接程序打开连接的组

查询并显示连接 Oracle 的用户和用户的会话数量

获取拥有者的对象数量

表空间历史增长量

清理killed的会话

删除主键及主键索引

数据文件自动扩展

注册监听

用户PROFILE

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部