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()

CentOS下安装Maven库

maven是基于项目对象模型(pom),可以通过一小段描述信息来完成复杂项目的构建,另外还有报告和文档功能,是一种强大的项目管理工具,包括java工程项目打包等。
安装Maven之前,先要正确安装JDK,
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
(SDK)下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
JDK安装脚本:

mkdir /usr/lib/jvm/
tar -xvf jdk-7u55-linux-x64.tar.gz -C /usr/lib/jvm/
echo "export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_55" >>  /etc/profile
source /etc/profile
echo "export JRE_HOME=${JAVA_HOME}/jre" >>  /etc/profile
source /etc/profile
echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib" >>  /etc/profile
echo "export PATH=${JAVA_HOME}/bin:$PATH" >>  /etc/profile
source /etc/profile
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_55/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_55/bin/javac 300

进入Apache maven官网:https://maven.apache.org/,然后点击Download进入下载界面,或者直接进入下载界面:https://maven.apache.org/download.cgi,这里下载最新版本的apache-maven-3.5.2的二进制包,

tar -xvzf apache-maven-3.5.2-bin.tar.gz
mv apache-maven-3.5.2 /usr/local/maven

添加环境变量/etc/profile

MAVEN_HOME=/usr/local/maven
export MAVEN_HOME

在PATH后追加:

:$MAVEN_HOME/bin
source /etc/profile

使新增配置生效
确认maven安装成功:

mvn -v

mvn clean 会把原来target目录给删掉重新生成。
mvn install 安装当前工程的输出文件到本地仓库,打war包
mvn clean install 先删除target文件夹,在打war包
附maven配置:

<?xml version="1.0" encoding="UTF-8"?>


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
   -->
  <localRepository>/usr/share/maven/repo</localRepository>
  

  <!-- interactiveMode
   | This will determine whether maven prompts you when it needs input. If set to false,
   | maven will use a sensible default value, perhaps based on some other setting, for
   | the parameter in question.
   |
   | Default: true
  <interactiveMode>true</interactiveMode>
  -->

  <!-- offline
   | Determines whether maven should attempt to connect to the network when executing a build.
   | This will have an effect on artifact downloads, artifact deployment, and others.
   |
   | Default: false
  <offline>false</offline>
  -->

  <!-- pluginGroups
   | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.
   | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers
   | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.
   |-->
  <pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
  </pluginGroups>



  <!-- proxies
   | This is a list of proxies which can be used on this machine to connect to the network.
   | Unless otherwise specified (by system property or command-line switch), the first proxy
   | specification in this list marked as active will be used.
   |-->
  <proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

  <!-- servers
   | This is a list of authentication profiles, keyed by the server-id used within the system.
   | Authentication profiles can be used whenever maven must make a connection to a remote server.
   |-->
  <servers>
    <!-- server
     | Specifies the authentication information to use when connecting to a particular server, identified by
     | a unique name within the system (referred to by the 'id' attribute below).
     |
     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
     |       used together.
     |
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->

    <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->
  </servers>


    <mirrors>
        <mirror>
            <id>nexus-releases</id>
            <mirrorOf>*</mirrorOf>
            <url>http://10.0.68.92:8080/nexus/content/groups/public/</url>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>nexus</id>
            <repositories>
                <repository>
                    <id>nexus-releases</id>
                    <url>http://10.0.68.92:8080/nexus/content/groups/public/</url>
                    <releases>
                        <enabled>true</enabled>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                </repository>
            </repositories>
        </profile>
    </profiles>

</settings>

安装sticky模块报错问题解决

sticky 模块在编译进nginx的时候,在以上nginx0.9版本会报错,需要修改源文件:

编译时出现错误:
cc1: warnings being treated as errors
ngx_http_sticky_module.c: In function ‘ngx_http_get_sticky_peer’:
/ngx_http_sticky_module.c:333: 警告:赋值时将整数赋给指针,未作类型转换
ake[1]: *** [objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_module.o] 错误 1

ngx_http_sticky_misc.c 的281行修改如下

digest->len = ngx_sock_ntop(in, digest->data, len, 1);

改后

digest->len = ngx_sock_ntop(in, sizeof(struct sockaddr_in), digest->data, len, 1);

ngx_http_sticky_module.c文件也进行修改
第6行添加:

#include <nginx.h>

2f811f7c-f464-3291-b40d-1b2e6529e760.jpg

第340行左右修改(iphp->rrp.current = iphp->selected_peer;)为:

if (peer && selected_peer >= 0) {
                 ngx_log_debug(NGX_LOG_DEBUG_HTTP, pc->log, 0, "[sticky/get_sticky_peer] peer found at index %i", selected_peer);
#if defined(nginx_version) && nginx_version >= 1009000
                 iphp->rrp.current = peer;
#else
                 iphp->rrp.current = iphp->selected_peer;
#endif

195434_cnGd_2611077.jpg

h.png

最后重新编译即可。
来源:
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/commits/51efa124a4330e194ef651e597a6038a6f7979dc

Nginx sticky模块实现基于cookie的负载均衡

在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用nginx 自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端是cdn,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能 保证每次访问都粘滞在同一台服务器。如果基于cookie会是一种什么情形,想想看, 每台电脑都会有不同的cookie,在保持长连接的同时还保证了服务器的压力均衡,nginx sticky值得推荐。

如果浏览器不支持cookie,那么sticky不生效,毕竟整个模块是给予cookie实现的.

nginx sticky 模块工作流程图
sticky-0.jpg

下载安装nginx sticky
下载地址:http://code.google.com/p/nginx-sticky-module/downloads/list
安装nginx + sticky模块

wget http://nginx-sticky-module.googlecode.com/files/nginx-sticky-module-1.1.tar.gz
tar -xzvf nginx-sticky-module-1.1.tar.gz
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-sticky-module-1.1
make
make install

平滑无缝升级Nginx并安装nginx + sticky模块
nginx每次安装一个新的模块都需要重新编译一次,编译完成之后将nginx这一个文件拷贝到sbin下面覆盖即可;

/usr/local/nginx/sbin/nginx -V  //需要查看原来安装的nginx的版本以及编译的参数
--with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-sticky-module-1.1  //原有参数基础之上增加参数
 
//--with-http_gzip_static_module        启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
//--with-http_stub_status_module                   启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
//--with-http_ssl_module                  启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
//--with-http_realip_module            启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)
//--add-module=PATH                启用外部模块支持
 
make  //编译完,在objs目录下有一个nginx执行文件,不要make install,否则就是覆盖安装;
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade       //替换老的nginx进程
再次执行:/usr/local/nginx/sbin/nginx -V 将会显示新的nginx的版本及编译的参数。
/usr/local/nginx/sbin/nginx -v  查看nginx版本号

配置nginx sticky

upstream pdapp {
     sticky;
     server 192.168.100.20:7100 weight=1 max_fails=2 fail_timeout=10s;
     server 192.168.100.21:7100 weight=1 max_fails=2 fail_timeout=10s;
}

最后reload nginx即可。
nginx sticky其他语法

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以为任何的string字符,默认是route
domain:哪些域名下可以使用这个cookie
path:哪些路径对启用sticky,例如path/test,那么只有test这个目录才会使用sticky做负载均衡
expires:cookie过期时间,默认浏览器关闭就过期,也就是会话方式。
no_fallbackup:如果设置了这个,cookie对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用

备注:每台后端真实服务器都会有一个唯一的route值,所以不管你真实服务器前端有几个装了sticky的nginx代理,他都是不会变化的. 这个cookie是会话方式的,所以你浏览器关闭了,服务器会给你重新分配一台服务器。

nginx sticky模块不能与ip_hash同时使用

官方文档:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky
http://code.google.com/p/nginx-sticky-module/wiki/Documentation

Nginx解决超长请求串(413 request Entity too Large错误解决办法)

nginx作为反向代理服务器,小文件上传可以,大文件上传会报413,400,414(如 413 request Entity too Large)等状态码,这是因为请求长度超过了nginx默认的缓存大小和最大客户端最大请求大小,增加或修改以下参数,一般可解决此类问题:
http段:

    keepalive_timeout 300;
    proxy_read_timeout 300;
    add_header Access-Control-Allow-Origin *;
    client_max_body_size    1000m;
    client_header_buffer_size 100m;
    large_client_header_buffers 4 512k;

nginx目录下的*temp要有写入权限,请求超出缓冲区大小时会写缓存文件;
location段:

      location ~* ^/OCC_DataCollection_Web/.*$ {
           include deny.conf;

           proxy_pass http://clcapp7300;
           proxy_set_header Host $http_host;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Scheme $scheme;
           proxy_set_header X-Script-Name /octoprint;
           client_max_body_size    1000m;

           error_log  logs/clc_OCC_DataCollection_Web_error.log error;
           access_log  logs/clc_OCC_DataCollection_Web_access.log  main;
       }

upstream段:

    upstream clcapp7300 {
      ip_hash;
      server 10.254.0.21:7300 weight=1 max_fails=2 fail_timeout=300s;
      server 10.254.0.22:7300 weight=1 max_fails=2 fail_timeout=300s;
    }

Http协议中的各种长度限制设置

HTTP1.0的格式

Request(HTTP请求消息)

结构:一个请求行.部分消息头,以及实体内容,其中的一些消息内容都是可选择的.消息头和实体内容之间要用空行分开.

GET /index.html HTTP/1.1 //请求头,下面都是消息头.

Accept: */*
Accept-Languang:en-us
Connection:keep-alive
Host:localhost
Referer:HTTP://localhost/index.html
User-Agent:Mozilla/4.0
Accept-Encoding:gzip,deflate//到上面都是消息头,下面一个空行表示完了,接下来是实体内容.
Response响应消息头

在接收并解析请求消息后,服务器以 HTTP 响应消息响应。相当服务器对客户的http的回应

结构:一个状态行.部分消息

头,以及实体内容,其中的一些消息内容都是可选择的.消息头和实体内容之间要用空行分开.

HTTP/1.1 200ok           //状态行.下面为消息头
Server:Apache2.2
Date:Thu, 13 Jul 2008 16:29:46 GMT
Content-Length:2222
Content-Type:text/html
Cache_control:private //和请求消息头一样下面有一个空行

注意:使用get的方法的请求消息中是不能包含实体内容的,只有使用post,put和delete的方法请求消息中才能有实体内容.对 HTTP1.1来讲,如果HTTP中有实体内容,但没有使用权chunked传输编码.那么消息头部分必须包含内容长度字段.不然不知什么时候内容才结 束。HTTP1.1中一定要有host字段

以上消息头的结构:每个消息头都包含一个头字段名称,然后依次是冒号,空格值,回车和换行符,字段不区分大小写.对消息头中的消息头可以任何顺序排列. 消息头可以分为信息头,请求头,响应头,实体头四类 如果有多个选项,可以用逗号分隔Accept-Encoding:gzip ,deflate

1.URL长度限制
在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描述的,HTTP协议并不对URI的长度做任何的限制,服务器端必须能够处理任何它们所提供服务多能接受的URI,并且能够处理无限长度的URI,如果服务器不能处理过长的URI,那么应该返回414状态码。

虽然Http协议规定了,但是Web服务器和浏览器对URI都有自己的长度限制。

服务器的限制:最多的服务器类型就是Nginx和Tomcat,对于url的长度限制,它们都是通过控制http请求头的长度来进行限制的,

nginx的配置参数为large_client_header_buffers
tomcat的请求配置参数为maxHttpHeaderSize

浏览器的限制:每种浏览器也会对url的长度有所限制,下面是几种常见浏览器的url长度限制:(单位:字符)

IE : 2803
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000

对于get请求,在url的长度限制范围之内,请求的参数个数没有限制。

2.Post数据的长度限制
Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http请求头长度的方式来实现。

3.Cookie的长度限制
Cookie的长度限制分这么几个方面来总结。

(1) 浏览器所允许的每个域下的最大cookie数目,没有去自己测试,从网上找到的资料大概是这么个情况

IE :原先为20个,后来升级为50个
Firefox: 50个
Opera:30个
Chrome:180个
Safari:无限制

当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。

(2) 浏览器所允许的每个Cookie的最大长度

Firefox和Safari:4079字节
Opera:4096字节
IE:4095字节

(3) 服务器中Http请求头长度的限制。Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。

4.Html5 LocalStorage
Html5提供了本地存储机制来供Web应用在客户端存储数据,尽管这个并不属于Http协议的一部分,但是随着Html5的流行,我们可能需要越来越多使用LocalStorage,甚至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道一样多。

对于LocalStorage的长度限制,同Cookie的限制类似,也是浏览器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:

FirefoxChromeOpera都是允许每个域的最大长度为5MB

但是这次IE比较大方,允许的最大长度是10MB

Tomcat性能参数设置

和最大连接数有关的配置:
应同时加大maxThreads和acceptCount。另外还有OS内核参数,通常Windows2000个左右,Linux1024。

conf/server.xml:
maxThreads="150"  最多同时处理150个连接。Tomcat可创建的最大线程数。150~250。   
minSpareThreads="25"   表示即使没有人使用也开这么多空线程等待,初始化时创建 ,
maxSpareThreads="75"  最多可空75个线程(一旦超过,Tomcat就关闭不再需要的socket线程。默认50)
acceptCount="100"   连接数达到maxThreads时,还可排队的连接数,超过则返回拒绝连接。(默认10)
enableLookups: 是否反查域名,默认true。为提高处理能力,应false 
connectionTimeout: 连接超时,默认60000毫秒。配0表示永不超时,但有隐患。通常可配30000。 
maxKeepAliveRequests: 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间)nginx动态的转给tomcat,nginx是不能keepalive的,而tomcat默认开启keepalive,会等待keepalive的timeout,默认不设置就是使用connectionTimeout。所以必须设置tomcat的超时时间,并关闭tomcat的keepalive。否则会产生大量tomcat的socket timewait。maxKeepAliveRequests="1"表示每个连接只响应一次就关闭,这就不会等待timeout了,可避免tomcat产生大量TIME_WAIT连接,从一定程度上避免tomcat假死。
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="30000" maxKeepAliveRequests="1" 
               redirectPort="8443" bufferSize="8192" sockedBuffer="65536" acceptCount="200"/>
bufferSize: 输入流缓冲大小,默认值2048 bytes。 
compression:压缩传输,取值on/off/force,默认值off。

参数说明:

keepAliveTimeout - 长连接最大保持时间(毫秒)。此处为15秒。
maxHttpHeaderSize - http 请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
URIEncoding - 指定Tomcat 容器的URL 编码格式。

disableUploadTimeout - 上传时是否使用超时机制

minProcessors - 最小空闲连接线程数,用于提高系统处理性能,默认值为10。
maxProcessors - 最大连接线程数,即:并发处理的最大请求数,默认值为75。

其他的配置
1、tomcat中如何禁止和允许列目录下的文档
在{tomcat_home}/conf/web.xml中,把listings参数配置成false即可,
指定JVM时区
window下, 在catalina.bat最前面:

set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m;-Duser.timezone=GMT+08;

一定加在catalina.bat最前面。

linux下,在catalina.sh最前面增加:

JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

注意:前后二者区别,有无set,有无双引号。
线程池配置(Tomcat6下)
打开/conf/server.xml,增加

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />

最大线程500(一般服务器足以),最小空闲线程数20,线程最大空闲时间60秒。

然后,修改<Connector ...>节点,增加executor属性,如:

<Connector executor="tomcatThreadPool" 
               port="80"

protocol="HTTP/1.1"

maxThreads="600"

minSpareThreads="100"

maxSpareThreads="300"
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               ....../>

maxThreads:Tomcat可创建的最大的线程数,每一个线程处理一个请求;

minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数;

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程;

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。

connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
enableLookups:是否允许DNS查询
注意:可以多个connector公用1个线程池。

3、调整连接相关Connector的参数:

<Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1" 
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               maxKeepAliveRequests="1"
               redirectPort="443"
               maxHttpHeaderSize="8192" URIEncoding="UTF-8" enableLookups="false" acceptCount="100" disableUploadTimeout="true"/>

参数说明:

connectionTimeout - 网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
keepAliveTimeout - 长连接最大保持时间(毫秒)。此处为15秒。
maxKeepAliveRequests - 最大长连接个数(1表示禁用,-1表示不限制个数,默认100个。一般设置在100~200之间) the maximum number of HTTP requests that can be held in the pipeline until the connection is closed by the server. Setting this attribute to 1 disables HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 allows an unlimited number of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.
maxHttpHeaderSize - http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
URIEncoding - 指定Tomcat容器的URL编码格式。
acceptCount - 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认为10个。defines the maximum queue length for incoming connection requests when all possible request processing threads are in use. Any requests received when the queue is full are refused. The default value is 10.
disableUploadTimeout - 上传时是否使用超时机制
enableLookups - 是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
bufferSize - defines the size (in bytes) of the buffer to be provided for input streams created by this connector. By default, buffers of 2048 bytes are provided.
maxSpareThreads - 做多空闲连接数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程 the maximum number of unused request processing threads that are allowed to exist until the thread pool starts stopping the unnecessary threads. The default value is 50.
maxThreads - 最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。。 the maximum number of request processing threads to be created by this Connector, which therefore determines the maximum number of simultaneous requests that can be handled. If not specified, this attribute is set to 200.
minSpareThreads - 最小空闲线程数,Tomcat初始化时创建的线程数 the number of request processing threads that are created when this Connector is first started. The connector will also make sure it has the specified number of idle processing threads available. This attribute should be set to a value smaller than that set for maxThreads. The default value is 4.
minProcessors - 最小空闲连接线程数,用于提高系统处理性能,默认值为10。(用于Tomcat4中)
maxProcessors - 最大连接线程数,即:并发处理的最大请求数,默认值为75。(用于Tomcat4中)

备注:

Tomcat4中可以通过修改minProcessors和maxProcessors的值来控制线程数。

在Tomcat5+主要对以下参数调整
maxThreads
Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。
acceptCount
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
connnectionTimeout
网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
minSpareThreads
Tomcat初始化时创建的线程数。
maxSpareThreads
一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

Nginx中使用Realip模块获取用户真实IP地址

Web服务器前端有代理服务器或者nginx做了二次转发或CDN时日志中的$remote_addr可能就不是客户端的真实IP了,IP默认会显示为前端代理的IP了,要获取到真实IP,常用的解决方法有以下三种:
1、使用CDN自定义IP头来获取
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
缺点:需要CDN厂商提供
CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:

proxy_set_header remote-user-ip $remote_addr;

后端将会收到remote_user_ip的http头,直接读取HTTP_REMOTE_USER_IP的内容基是客户端真实IP





---阅读剩余部分---

根据日志统计Nginx访问量

PV(Page View):即页面浏览量或者点击量,用户每一次对网站中每个页面访问均记录1个PV。用户对同一页面的多次访问,访问量累积。

UV(Unique Visitor):指通过互联网浏览这个网页的人,电脑称为一个访客、手机也称为一个访客,一天之内相同的客户端只能被计算一次。

IP(Internet Protocol):指独立IP访问站点的IP总数,一天内相同IP只能算一次。

VV(Visit View):指所有访客一天内访问网站的次数,当访客完成所有浏览并最终关闭网站的所有页面时变完成了一次访问,同一访客一天内可能有多次访问行为,访问次数累积。

查看各个访问量:

1.根据访问IP统计UV

awk '{print $1}'  /var/log/nginx/access.log|sort | uniq -c |wc -l

---阅读剩余部分---

Oracle启用和禁用触发器

1、禁用 table_name 表的所有 trigger

alter table table_name disable all triggers;  

2、启用 table_name 表的所有 trigger

alter table table_name enable all triggers;  

3、禁用指定 trigger

alter trigger trigger_name disable;  

4、启用指定 trigger

alter trigger trigger_name enable;

5、查询xxx触发器具体内容

SELECT text FROM ALL_SOURCE where TYPE='TRIGGER' AND NAME ='xxx';

最新

分类

归档

评论

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

其它