2018年2月

MongoDB备份/还原/导出/导入

mongodb数据备份和还原主要分为二种,一种是针对于库的mongodump和mongorestore,一种是针对库中表的mongoexport和mongoimport。
mongodb.png
一、mongodump备份数据库
常用命令

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径  

如果没有用户谁,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。
导出所有数据库

mongodump -h 127.0.0.1 --port 30000 -o /tmp/mon

导出指定库

mongodump -h 127.0.0.1 --port 30000 -d DBNAME -o /tmp/mon

二、mongorestore还原数据库

mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件路径

--drop的意思是,先删除所有的记录,然后恢复
恢复所有数据库到mongodb中

mongorestore -h 127.0.0.1 --port 30000 /tmp/mon

还原指定的数据库

mongorestore -h 127.0.0.1 --port 30000 -d NEWDB /tmp/mon/newdb

三、mongoexport导出表,或者表中部分字段
常用命令格式

mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名  

-f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q 可以根查询条件导出,-q '{ "uid" : "100" }' 导出uid为100的数据
--csv 表示导出的文件格式为csv的,这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点
导出整张表

mongoexport -d DBNAME -c TBNAME -o /tmp/mon/xxx/xxxx.dat

导出表中部分字段

mongoexport -d DBNAME -c TBNAME -f uid,name,sex -o /tmp/mon/xxx/xxxx.dat

根据条件导出

mongoexport -d DBNAME -c TBNAME -q '{uid:{$gt:1}}' -o /tmp/mon/users.json

四、mongoimport导入表或表字段
还原整表导出的非csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名  
--upsert参数:插入或者更新现有数据

还原部分字段的导出文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields参数:插入或者更新现有数据

还原导出的csv文件

mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名

还原导出的表数据

mongoimport -d DBNAME -c TBNAME --upsert /tmp/mon/users.dat

部分字段的表数据导入

mongoimport -d DBNAME -c TBNAME  --upsertFields uid,name,sex /tmp/mon/users.dat

还原csv文件

mongoimport -d DBNAME -c TBNAME --type csv --headerline --file /tmp/mon/users.csv

MySQL中使用Optimize优化表

OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)。

多数时间并不需要运行OPTIMIZE TABLE,只需在批量删除数据行之后,或定期(每周一次或每月一次)进行一次数据表优化操作即可,只对那些特定的表运行,这个操作对于游戏数据库中的某些表特别起作用,这些表基本上需要每周做一次优化,甚至一周两次。

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

OPTIMIZE TABLE TABLENAME

对于MyISAM表,OPTIMIZE TABLE按如下方式操作:

  1. 如果表已经删除或分解了行,则修复表。
  2. 如果未对索引页进行分类,则进行分类。
  3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。

对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。

对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表、更新索引统计信息、回收主键索引中空间。

在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
如果MySQL是有备库的,只希望在主库上执行的话,那么可以加上关键字NO_WRITE_TO_BINLOG(或者LOCAL,意思完全相同)。

Postgresql修改存储位置注意事项

1、修改postgresql.conf文件中的data_directory项内容,指定自己要存储数据的文件夹。

data_directory = '/data/pg10data/'

2、修改/usr/lib/systemd/system/postgresql-10.service中Environment项的内容

Environment=PGDATA=/data/pg10data/

3、将修改后的文件夹的属组和属主都改成postgre

chown postgres:postgres /data/pg10data

4、将修改后的文件夹的权限改成0700,即chmod 700 文件夹路径

chmod 700 /data/pg10data

查看PostgreSQL版本号

在Linux系统下,可以通过命令“postgres -V”或者命令“psql -V”查看

su - postgres
psql -V  或者 psql --version
psql (PostgreSQL) 10.1

在数据库里面直接使用SELECT version();查询

postgres=# select version();   #当前客户端Postgresql版本号
                                                 version                                                 
---------------------------------------------------------------------------------------------------------
 PostgreSQL 10.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit
(1 row)

postgres=# show server_version;   #查看所连接服务器端Postgresql版本号
 server_version 
----------------
 10.1
(1 row)

修改PostgreSQL数据库默认用户postgres密码

PostgreSQL 安装完成后,会建立一下'postgres'用户,用于执行PostgreSQL,数据库中也会建立一个'postgres'用户,默认密码为自动生成,需要在系统中改一下。

su - postgres    #切换用户,执行后提示符会变为 '-bash-4.2$'
psql -U postgres #登录数据库,执行后提示符变为 'postgres=#'
ALTER USER postgres WITH PASSWORD 'xxxxxx';  设置postgres用户密码 或者直接输入
\q  #退出数据库

也可以用下面这个方式

su - postgres
psql    #登录pg
\password postgres          #给postgres用户设置密码
Enter new password: 
Enter it again: 
\q

CentOS7.4快速安装PostgreSQL10.1

PostgreSQL可根据不同操作系统版本现在相应的安装包,在官方下载https://www.postgresql.org/download/ 根据数据库版本、操作系统版本选择相对应的的版本:
postgresql10.jpg
安装yum更新源

yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-redhat10-10-1.noarch.rpm

安装PostgreSQL客户端和服务端

yum install postgresql10 -y
yum install postgresql10-server -y

修改配置、初始化数据库,启动服务

mkdir /data/pg10data
mkdir /data/pg10data
chmod 700 /data/pg10data
chown postgres:postgres /data/pg10data
vim /usr/lib/systemd/system/postgresql-10.service
把Environment=PGDATA=/var/lib/pgsql/10/data/修改为Environment=PGDATA=/data/pg10data/

/usr/pgsql-10/bin/postgresql-10-setup initdb   #初始化
systemctl enable postgresql-10                 #设置开机启动    
systemctl start postgresql-10                  #启动postgresql服务   

也可以使用postgreSQL自带的初始化命令initdb初始化数据库:

su - postgres
初始化
/usr/pgsql-10/bin/initdb --encoding=UTF-8 --local=zh_CN.UTF8 --pgdata=/data/pg10data/
启动
/usr/pgsql-10/bin/pg_ctl -D /data/pg10data/ -l /data/pg10data/log/pglog start
停止
/usr/pgsql-10/bin/pg_ctl -D /data/pg10data/ -l /data/pg10data/log/pglog stop
#写入系统启动项
echo "su - postgres -c '/usr/pgsql-10/bin/pg_ctl -D /data/pg10data/ -l /data/pg10data/log/pglog start'" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local   

使用一种方式就可以了。

开启远程访问

vim /data/pg10data/postgresql.conf 
修改#listen_addresses = 'localhost'  为  listen_addresses='*'

当然,'*'也可以改为任何你想开放的服务器IP

信任远程连接

echo "host    all             all             192.168.120.1/24        password" >> /data/pg10data/pg_hba.conf

允许192.168.120段的机器可以使用密码认证的方式访问数据库

修改数据目录位置

vim /data/pg10data/postgresql.conf 
data_directory = '/data/pg10data/'

最后重启postgresql服务生效

systemctl restart postgresql-10

python逐行删除文件

要删除的文件在一个txt文件里面,每行一个地址,直接使用readline然后调用系统命令删除,脚本如下

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import os
myfile = codecs.open("del.txt","rw","utf-8")
line = myfile.readline()
while line:
    print line,
    line = line.strip('\n\r') #去除每行的换行符
    os.system('rm -rf %s' % (line))  
    line = myfile.readline()
myfile.close()

Oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT

在删除列、或表的时候报错“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”,一般都是发生锁表造成的,或者上一条语句没有执行完成,阻塞造成了锁表;
ORA-00054.png
解决方法:
找出锁表sid

select SESS.sid, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME,
      AO.OBJECT_NAME, LO.LOCKED_MODE
from V$LOCKED_OBJECT LO, DBA_OBJECTs AO, V$SESSION SESS
where AO.OBJECT_ID = LO.OBJECT_ID 
and lo.session_id = sess.sid;

select session_id from v$locked_object;

SESSION_ID
----------
127623

根据查询出来的session_id查询

SELECT sid, serial#, username, osuser FROM v$session where sid = 127623;

SID SERIAL# USERNAME OSUSER
---------- ---------- ------------------------------ ------------------------------
127623 3412 SCOTT LILWEN

kill掉

ALTER SYSTEM KILL SESSION '127623,3412';

System altered

也可以用系统级杀进程的kill释放锁:

select spid from v$process where addr = (select paddr
from v$session where sid=&sid);
kill -9 127623 ;

再次执行删除操作即可;
注意点:如果出现了锁的问题, 某个DML操作可能等待很久没有反应。 当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁,杀OS进程并不能彻底清除锁的问题。

ORA-01031权限不足解决方法

在Oracle11gR2数据库上,以DBA权限的账号执行存储过程报错,PL/SQL:ORA-01031:权限不足,如下图
01031.png

原因:
1、ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显示授权。
2、如果使用AUTHID CURRENT_USER关键字使用调用者权限,则编译时ROLE无效,运行时有效。

解决办法:

方法1:对存储过程来说,CREATE TABLE想使用CREATE ANY TABLE权限,而CREATE ANY TABLE权限来自DBA角色,默认情况下,虽然在会话环境中可见,但在存储过程中不可见(无效)

所以根据上面的第一条规则,可以显示地将CREATE ANY TABLE权限授予DBA用户就可以了,即

GRANT update ANY TABLE TO xxxuser; #里面的权限根据具体存储过程更改

方法2:采用调用者权限,由于过程中使用动态SQL,所以可以避开编译时的检查,但在运行时DBA角色生效,即

CREATE OR REPLACE PROCEDURE INSERT_DATA --插入user_客户ID,套餐表,客户宽表
(RTN_ID OUT NUMBER, --返回错误ID
 RTN_STR OUT VARCHAR --返回错误叙述
 ) AUTHID CURRENT_USER IS

Oracle11g性能参数常用查询SQL

当前会话的SID,SERIAL#

SELECT Sid, Serial# FROM V$session WHERE Audsid = Sys_Context('USERENV', 'SESSIONID');

查询session的OS进程ID

SELECT p.Spid "OS Thread", b.NAME "Name-User", s.Program, s.Sid, s.Serial#,s.Osuser, s.Machine
FROM V$process p, V$session s, V$bgprocess b
WHERE p.Addr = s.Paddr
AND p.Addr = b.Paddr And (s.sid=&1 or p.spid=&1)
UNION ALL
SELECT p.Spid "OS Thread", s.Username "Name-User", s.Program, s.Sid,s.Serial#, s.Osuser, s.Machine
FROM V$process p, V$session s
WHERE p.Addr = s.Paddr
And (s.sid=&1 or p.spid=&1)
AND s.Username IS NOT NULL;

根据sid查看对应连接正在运行的sql

SELECT /*+ PUSH_SUBQ */ Command_Type, Sql_Text, Sharable_Mem, Persistent_Mem, Runtime_Mem, Sorts,
Version_Count, Loaded_Versions, Open_Versions, Users_Opening, Executions,
Users_Executing, Loads, First_Load_Time, Invalidations, Parse_Calls,
Disk_Reads, Buffer_Gets, Rows_Processed, SYSDATE Start_Time,
SYSDATE Finish_Time, '>' || Address Sql_Address, 'N' Status
FROM V$sqlarea WHERE Address = (SELECT Sql_Address
FROM V$session WHERE Sid = &sid );

查找object为哪些进程所用

SELECT p.Spid, s.Sid, s.Serial# Serial_Num, s.Username User_Name,
a.TYPE Object_Type, s.Osuser Os_User_Name, a.Owner,
a.OBJECT Object_Name,
Decode(Sign(48 - Command), 1, To_Char(Command), 'Action Code #' || To_Char(Command)) Action,
p.Program Oracle_Process, s.Terminal Terminal, s.Program Program,
s.Status Session_Status
FROM V$session s, V$access a, V$process p
WHERE s.Paddr = p.Addr
AND s.TYPE = 'USER'
AND a.Sid = s.Sid
AND a.OBJECT = '&obj'
ORDER BY s.Username, s.Osuser

查看有哪些用户连接

SELECT s.Osuser Os_User_Name,Decode(Sign(48 - Command),1,To_Char(Command),
'Action Code #' || To_Char(Command)) Action,
p.Program Oracle_Process, Status Session_Status, s.Terminal Terminal,
s.Program Program, s.Username User_Name,
s.Fixed_Table_Sequence Activity_Meter, '' Query, 0 Memory,
0 Max_Memory, 0 Cpu_Usage, s.Sid, s.Serial# Serial_Num
FROM V$session s, V$process p
WHERE s.Paddr = p.Addr
AND s.TYPE = 'USER'
ORDER BY s.Username, s.Osuser

查看锁(lock)情况

SELECT /*+ RULE */ Ls.Osuser Os_User_Name, Ls.Username User_Name,Decode(Ls.TYPE,
'RW', 'Row wait enqueue lock', 'TM', 'DML enqueue lock','TX', 'Transaction enqueue lock', 'UL', 'User supplied lock') Lock_Type,o.Object_Name OBJECT,Decode(Ls.Lmode,1, NULL, 2, 'Row Share', 3, 'Row Exclusive',
4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive',NULL) Lock_Mode,o.Owner, Ls.Sid, Ls.Serial# Serial_Num, Ls.Id1, Ls.Id2 FROM Sys.Dba_Objects o,
(SELECT s.Osuser, s.Username, l.TYPE, l.Lmode, s.Sid, s.Serial#, l.Id1,l.Id2 FROM V$session s, V$lock l
WHERE s.Sid = l.Sid) Ls
WHERE o.Object_Id = Ls.Id1
AND o.Owner <> 'SYS'
ORDER BY o.Owner, o.Object_Name;

查看等待(wait)情况

SELECT Ws.CLASS, Ws.COUNT COUNT, SUM(Ss.VALUE) Sum_Value
FROM V$waitstat Ws, V$sysstat Ss
WHERE Ss.NAME IN ('db block gets', 'consistent gets')
GROUP BY Ws.CLASS, Ws.COUNT;

查询会话的阻塞

SELECT /*+ rule */ Lpad(' ', Decode(l.Xidusn, 0, 3, 0)) || l.Oracle_Username User_Name,
o.Owner, o.Object_Name, s.Sid, s.Serial#
FROM V$locked_Object l, Dba_Objects o, V$session s
WHERE l.Object_Id = o.Object_Id
AND l.Session_Id = s.Sid
ORDER BY o.Object_Id, Xidusn DESC;
col username format a15
col lock_level format a8
col owner format a18
col object_name format a32
SELECT /*+ rule */ s.Username,Decode(l.TYPE, 'tm', 'table lock', 'tx', 'row lock', NULL) Lock_Level,
o.Owner, o.Object_Name, s.Sid, s.Serial#
FROM V$session s, V$lock l, Dba_Objects o
WHERE l.Sid = s.Sid
AND l.Id1 = o.Object_Id(+)
AND s.Username IS NOT NULL;

等待的事件及会话信息

SELECT Se.Sid, s.Username, Se.Event, Se.Total_Waits, Se.Time_Waited,Se.Average_Wait
FROM V$session s, V$session_Event Se
WHERE s.Username IS NOT NULL
AND Se.Sid = s.Sid
AND s.Status = 'ACTIVE'
AND Se.Event NOT LIKE '%SQL*Net%'
ORDER BY s.Username;
SELECT s.Sid, s.Username, Sw.Event, Sw.Wait_Time, Sw.State,Sw.Seconds_In_Wait
FROM V$session s, V$session_Wait Sw
WHERE s.Username IS NOT NULL
AND Sw.Sid = s.Sid
AND Sw.Event NOT LIKE '%SQL*Net%'
ORDER BY s.Username;

会话等待的file_id/block_id

col event format a24
col p1text format a12
col p2text format a12
col p3text format a12
SELECT Sid, Event, P1text, P1, P2text, P2, P3text, P3
FROM V$session_Wait
WHERE Event NOT LIKE '%SQL%'
AND Event NOT LIKE '%rdbms%'
AND Event NOT LIKE '%mon%'
ORDER BY Event;
SELECT NAME, Wait_Time
FROM V$latch l
WHERE EXISTS (SELECT 1
FROM (SELECT Sid, Event, P1text, P1, P2text, P2, P3text, P3
FROM V$session_Wait
WHERE Event NOT LIKE '%SQL%'
AND Event NOT LIKE '%rdbms%'
AND Event NOT LIKE '%mon%') x
WHERE x.P1 = l.Latch#);

当前session的跟踪文件

SELECT P1.VALUE || '/' || P2.VALUE || '_ora_' || p.Spid || '.ora' Filename
FROM V$process p, V$session s, V$parameter P1, V$parameter P2
WHERE P1.NAME = 'user_dump_dest'
AND P2.NAME = 'instance_name'
AND p.Addr = s.Paddr
AND s.Audsid = Userenv('SESSIONID')
AND p.Background IS NULL
AND Instr(p.Program, 'CJQ') = 0;

查询锁定的对象

SELECT Do.Object_Name, Session_Id, Process, Locked_Mode
FROM V$locked_Object Lo, Dba_Objects Do
WHERE Lo.Object_Id = Do.Object_Id;

各项SGA相关参数:SGA,SGASTAT

select substr(name,1,10) name,substr(value,1,10) value
from v$parameter where name = 'log_buffer';
select * from v$sgastat ;
select * from v$sga;
show parameters area_size   #查看 各项区域内存参数, 其中sort_area为排序参数用;

各项视图建议参数值:V$DB_CACHE_ADVICE、V$SHARED_POOL_ADVICE),关于PGA
也有相关视图V$PGA_TARGET_ADVICE 等。

Oracle性能相关常用脚本整理(SQL)

Oracle10g和11g下面都可以直接查询,SQL优化系统调优的时候经常会用到

最多BUFFER_GETS开销的SQL语句TOP 10

SET LINESIZE 190  
COL sql_text FORMAT a100 WRAP  
SET PAGESIZE 100  
  
SELECT *  
  FROM (  SELECT sql_text,  
                 sql_id,  
                 executions,  
                 disk_reads,  
                 buffer_gets  
            FROM v$sqlarea  
           WHERE DECODE (executions, 0, buffer_gets, buffer_gets / executions) >  
                    (SELECT AVG (DECODE (executions, 0, buffer_gets, buffer_gets / executions))  
                            + STDDEV (DECODE (executions, 0, buffer_gets, buffer_gets / executions))  
                       FROM v$sqlarea)  
                 AND parsing_user_id != 3D  
        ORDER BY 5 DESC) x
 WHERE ROWNUM <= 10;

查询最多DISK_READS开销的SQL语句TOP10

SET LINESIZE 190  
COL sql_text FORMAT a100 WRAP  
SET PAGESIZE 100  
  
SELECT *  
  FROM (  SELECT sql_text,  
                 sql_id,  
                 executions,  
                 disk_reads,  
                 buffer_gets  
            FROM v$sqlarea  
           WHERE DECODE (executions, 0, disk_reads, disk_reads / executions) >  
                    (SELECT AVG (DECODE (executions, 0, disk_reads, disk_reads / executions))  
                            + STDDEV (DECODE (executions, 0, disk_reads, disk_reads / executions))  
                       FROM v$sqlarea)  
                 AND parsing_user_id != 3D  
        ORDER BY 4 DESC) x
 WHERE ROWNUM <= 10;

查询30分钟导致资源过高开销的事件

SET LINESIZE 180  
COL event FORMAT a60  
COL total_wait_time FORMAT 999999999999999999  
  
  SELECT active_session_history.event,  
         SUM (  
            active_session_history.wait_time  
            + active_session_history.time_waited)  
            total_wait_time  
    FROM v$active_session_history active_session_history  
   WHERE active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880  
                                                AND SYSDATE  
         AND active_session_history.event IS NOT NULL  
GROUP BY active_session_history.event  
ORDER BY 2 DESC; 

最近30分钟内等待最多的用户

SET LINESIZE 180  
COL event FORMAT a60  
COL total_wait_time FORMAT 999999999999999999  
  
  SELECT ss.sid,  
         NVL (ss.username, 'oracle') AS username,  
         SUM (ash.wait_time + ash.time_waited) total_wait_time  
    FROM v$active_session_history ash, v$session ss  
   WHERE ash.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE AND ash.session_id = ss.sid  
GROUP BY ss.sid, ss.username  
ORDER BY 3 DESC;  

30分钟消耗最多资源的SQL语句

SET LINESIZE 180  
COL sql_text FORMAT a90 WRAP  
COL username FORMAT a20 WRAP  
SET PAGESIZE 200  
SELECT *  
  FROM (  SELECT sqlarea.sql_text,  
                 dba_users.username,  
                 sqlarea.sql_id,  
                 SUM (active_session_history.wait_time + active_session_history.time_waited)  
                    total_wait_time  
            FROM v$active_session_history active_session_history, v$sqlarea sqlarea, dba_users  
           WHERE     active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE  
                 AND active_session_history.sql_id = sqlarea.sql_id  
                 AND active_session_history.user_id = dba_users.user_id  
        GROUP BY active_session_history.user_id,  
                 sqlarea.sql_text,  
                 sqlarea.sql_id,  
                 dba_users.username  
        ORDER BY 4 DESC) x  
 WHERE ROWNUM <= 11;

等待最多的对象

SET LINESIZE 180  
COLUMN OBJECT_NAME FORMAT a30  
COLUMN EVENT FORMAT a30  
  
  SELECT dba_objects.object_name,  
         dba_objects.object_type,  
         active_session_history.event,  
         SUM (active_session_history.wait_time + active_session_history.time_waited) ttl_wait_time  
    FROM v$active_session_history active_session_history, dba_objects  
   WHERE active_session_history.sample_time BETWEEN SYSDATE - 60 / 2880 AND SYSDATE  
         AND active_session_history.current_obj# = dba_objects.object_id  
GROUP BY dba_objects.object_name, dba_objects.object_type, active_session_history.event  
ORDER BY 4 DESC;

查询基于指定时间范围内的历史SQL语句

--注该查询受到awr快照相关参数的影响  
-- filename:top_sql_in_spec_time.sql  
--Top SQLs Elaps time and CPU time in a given time range..  
--X.ELAPSED_TIME/1000000 => From Micro second to second  
--X.ELAPSED_TIME/1000000/X.EXECUTIONS_DELTA => How many times the sql ran  

SET PAUSE ON  
SET PAUSE 'Press Return To Continue'  
SET LINESIZE 180  
COL sql_text FORMAT a80 WRAP  
  
  SELECT sql_text,  
         dhst.sql_id,  
         ROUND (x.elapsed_time / 1000000 / x.executions_delta, 3) elapsed_time_sec,  
         ROUND (x.cpu_time / 1000000 / x.executions_delta, 3) cpu_time_sec,  
         x.elapsed_time,  
         x.cpu_time,  
         executions_delta AS exec_delta  
    FROM dba_hist_sqltext dhst,  
         (  SELECT dhss.sql_id sql_id,  
                   SUM (dhss.cpu_time_delta) cpu_time,  
                   SUM (dhss.elapsed_time_delta) elapsed_time,  
                   CASE SUM (dhss.executions_delta) WHEN 0 THEN 1 ELSE SUM (dhss.executions_delta) END  
                      AS executions_delta  
              FROM dba_hist_sqlstat dhss  
             WHERE dhss.snap_id IN  
                      (SELECT snap_id  
                         FROM dba_hist_snapshot  
                        WHERE begin_interval_time >= TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
                              AND end_interval_time <= TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI'))  
          GROUP BY dhss.sql_id) x  
   WHERE x.sql_id = dhst.sql_id  
ORDER BY elapsed_time_sec DESC; 

基于指定时间范围内及指定用户的历史SQL语句

--注该查询受到awr快照相关参数的影响  
SELECT DBMS_LOB.SUBSTR (sql_text, 4000, 1) AS sql,  
         ROUND (x.elapsed_time / 1000000, 2) elapsed_time_sec,  
         ROUND (x.cpu_time / 1000000, 2) cpu_time_sec,  
         x.executions_delta AS exec_num,  
         ROUND ( (x.elapsed_time / 1000000) / x.executions_delta, 2) AS exec_time_per_query_sec  
    FROM dba_hist_sqltext dhst,  
         (  SELECT dhss.sql_id sql_id,  
                   SUM (dhss.cpu_time_delta) cpu_time,  
                   SUM (dhss.elapsed_time_delta) elapsed_time,  
                   CASE SUM (dhss.executions_delta) WHEN 0 THEN 1 ELSE SUM (dhss.executions_delta) END  
                      AS executions_delta  
              --DHSS.EXECUTIONS_DELTA = No of queries execution (per hour)  
              FROM dba_hist_sqlstat dhss  
             WHERE dhss.snap_id IN  
                      (SELECT snap_id  
                         FROM dba_hist_snapshot  
                        WHERE begin_interval_time >= TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
                              AND end_interval_time <= TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI'))  
                   AND dhss.parsing_schema_name LIKE UPPER ('%&input_username%')  
          GROUP BY dhss.sql_id) x  
   WHERE x.sql_id = dhst.sql_id  
ORDER BY elapsed_time_sec DESC;

查询SQL语句被执行的次数:

SET LINESIZE 180  
SET VERIFY OFF  
  
SELECT TO_CHAR (s.begin_interval_time, 'yyyymmdd hh24:mi:ss'),  
         sql.sql_id AS sql_id,  
         sql.executions_delta AS exe_delta,  
         sql.executions_total  
    FROM dba_hist_sqlstat sql, dba_hist_snapshot s  
   WHERE     sql_id = '&input_sql_id'  
         AND s.snap_id = sql.snap_id  
         AND s.begin_interval_time > TO_DATE ('&input_start_date', 'YYYYMMDD HH24:MI')  
         AND s.begin_interval_time < TO_DATE ('&input_end_date', 'YYYYMMDD HH24:MI')  
ORDER BY s.begin_interval_time; 

Python模块之codecs: 自然语言编码转换

当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
原有编码 -> 内部编码 -> 目的编码
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码位,另一种是UCS-4,它有2147483648g个码位。对于这两种格式,python都是支持的,这个是在编译时通过--enable-unicode=ucs2或--enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个办法,就是通过sys.maxunicode的值来判断:

import sys
print sys.maxunicode

如果输出的值为65535,那么就是UCS-2,如果输出是1114111就是UCS-4编码
使用codecs读取中文csv文件:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import codecs
import sys
print sys.getdefaultencoding()
myfile = codecs.open("test.csv","r","gbk")    #文档是ANSI格式的时候使用gbk,否则直接使用utf-8
line = myfile.readline()
while line:
     print line,
     line = myfile.readline()
myfile.close()

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它