0%

重启服务并不能重置postgresql的统计计数器,比如pg_stat_database的deadlocks计数器,可以使用select pg_stat_reset();来重置各种统计计数器。

官方下载的SystemRescueCd ISO并不支持制作启动u盘,所以需要先将iso转换成可硬盘/u盘启动的iso
使用isohybrid命令来转换,需要先安装syslinux-utils包

1
# apt install syslinux-utils 

然后执行转换

1
$ isohybrid systemrescuecd-x86-x.x.x.iso

此命令会进行就地转换,因为如需保留原iso的话请先备份。

然后写入u盘就可以了:
[bash 1=”dd” if=”systemrescuecd.iso” of=”/dev/sdc” 2=”[/bash” language=”#”]```

===
[erq]

rtorrent原生支持magnet链接,主界面上按enter键,出现"load.normal"提示符,输入magnet链接,回车即可。

如果想要magnet自动添加到watch文件夹,可以用下面这个脚本:

1
2
3
4
5
#!/bin/bash
watch_folder=~/downloads/.watch
cd $watch_folder
\[\[ "$1" =~ xt=urn:btih:(\[^&/\]+) \]\] exit;
echo "d10:magnet-uri${ #1}:${1}e" > "meta-${BASH_REMATCH\[1\]}.torrent"

将脚本保存为一个文件,并添加可执行权限,然后将其作为magnet的协议处理器即可。

也可以从文件中读取magnet喂给rtorrent:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

watch_folder=~/downloads/.watch
cd ${watch_folder} exit # set your watch directory here

cnt=1
cat "${1}" while read i
do
\[\[ "$i" =~ xt=urn:btih:(\[^&/\]+) \]\] exit
echo "d10:magnet-uri${ #i}:${i}e" > "${cnt}.torrent"
cnt=$\[cnt+1\]
done

存储magnet链接的文件作为命令行参数传递给脚本,文件中每个magnet链接作为单独的一行。

References:
[1] Saving magnet links as torrent files in watch folder
[2]磁力链接是如何实现下载的?
[3]磁力链接
[4]分布式散列表

===
[erq]

postgesql查询序列当前值可以使用SELECT last_value FROM sequence_name;这个是跨session的。

ss无法启动了,/var/log/shadowsocks.log报错:

1
AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

是因为openssl1.1.0版本中,废弃了EVP_CIPHER_CTX_cleanup函数,可以用EVP_CIPHER_CTX_reset来代替此函数

此文件/usr/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py中搜索所有的EVP_CIPHER_CTX_cleanup以EVP_CIPHER_CTX_reset代替即可,总共有两处。

References:
[1]解决openssl升级到1.1.0后shadowsocks服务报错问题

===
[erq]

游标会占用系统资源,oracle中游标分配在shared pool内存池,用完了连接(connection)、语句(statement,preparedStatement)和结果集(resultSet)一定要记得释放,不然系统打开游标会持续上升,直到达到系统设置的阈值,无法获取游标的事务就会失败。

查看系统配置的最大打开游标数量和当前已打开游标数量
[sql]
sql> select (select count(*) from V$OPEN_CURSOR) as opened_cursors,
(select value from v$parameter where name=’open_cursors’) as max_cursors from dual;
OPENED_CURSORS MAX_CURSORS


1362 65535
[/sql]

查询会话打开的游标

[sql]
sql> select s.sid, s.username, s.osuser,s.machine, a.value
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic# and s.sid=a.sid and b.name = ‘opened cursors current’ and s.username is not null
order by a.value desc;
SID USERNAME OSUSER MACHINE VALUE


405 TT NETWORK?SERVICE WORKGROUP\VIRT-APP-EXTERN 51
466 TT NETWORK?SERVICE WORKGROUP\VIRT-APP 49
491 TT Administrator WORKGROUP\VIRT-APP 13
422 TT Administrator WORKGROUP\VIRT-APP 11
475 TT Administrator WORKGROUP\VIRT-APP 10
……
[/sql]
或者
[sql]
sql> select o.sid, s.username, s.osuser, s.machine, count(*) num
from v$open_cursor o, v$session s
where o.sid = s.sid
group by o.sid,s.username, s.osuser, s.machine
order by num desc;
SID USERNAME OSUSER MACHINE NUM


464 TT NETWORK?SERVICE WORKGROUP\VIRT-APP-EXTERN 34
471 TT NETWORK?SERVICE WORKGROUP\VIRT-APP-EXTERN 30
475 TT Administrator WORKGROUP\VIRT-APP 28
491 TT Administrator WORKGROUP\VIRT-APP 27
……
[/sql]

查询会话执行的sql语句

[sql]
sql> select sid, sql_text, count(sql_text) as num
from v$open_cursor
group by sid, sql_text having count(sql_text)>5
order by num desc;
SID SQL_TEXT NUM


464 select b.*,bb.buildno,bb.BUILDNAME from bldroom b join build 40
464 select t2.businessname,t3.firstname,t1.opion,t1.receivedatet 36
464 select distinct t2.certid,t2.certno from rightcertroom t1 jo 34
……
[/sql]

或者更直接的查询每个sql语句打开的游标数量
[sql]
sql> select s.sid, s.osuser,s.machine, o.sql_text, count(o.sql_text) as num
from v$open_cursor o
join v$session s on o.sid=s.sid
group by s.sid, s.osuser,s.machine,o.sql_text having count(o.sql_text)>50
order by num desc;
SID OSUSER MACHINE SQL_TEXT NUM


464 tomcat8 clean select t2.businessname,t3.firstname,t1.opion,t1.receivedatet 35
464 tomcat8 clean select b.*,bb.buildno,bb.BUILDNAME from bldroom b join build 34
464 tomcat8 clean select distinct t2.certid,t2.certno from rightcertroom t1 jo 28
……
[/sql]

找到对应的SQL语句就可以审计对应的代码,查找资源泄露的情况。

===
[erq]

oracle表空间有四种状态ONLINE,READ WRITE,READ ONLY和OFFLINE,READ WRITE和READ ONLY是ONLINE的特殊情况。

查询表空间状态:
[sql]
sql> select tablespace_name,status from dba_tablespaces;
[/sql]

修改表空间状态:
[sql]
sql> alter tablespace tablespace_name offline/online/read only/read write;
[/sql]

===
[erq]

oracle参数OPEN_CURSORS设置值的范围为0~65535,设置比实际需要大的多的值并没有额外的负担。v$sessmetric视图可以查看每个会话的资源消耗状况。

切记:永远不要手工删除postgresql数据库目录下的文件。

一个测试库,因为开启了归档,而归档命令又失败了,导致归档日志暴涨,把根文件系统撑爆了,因为只是测试库,所以没在意,从配置文件中关了归档,
直接去pg_xlog目下手工干掉了所有的归档日志,然后问题就来了。

重新启动postgresql服务失败,错误日志:

1
2
3
4
5
6
2016-11-26 13:47:53 CST \[24422-1\] LOG: database system was shut down at 2016-11-26 13:42:38 CST
2016-11-26 13:47:53 CST \[24422-2\] LOG: invalid primary checkpoint record
2016-11-26 13:47:53 CST \[24422-3\] LOG: invalid secondary checkpoint record
2016-11-26 13:47:53 CST \[24422-4\] PANIC: could not locate a valid checkpoint record
2016-11-26 13:47:53 CST \[24421-1\] LOG: startup process (PID 24422) was terminated by signal 6: Aborted
2016-11-26 13:47:53 CST \[24421-2\] LOG: aborting startup due to startup process failure

检查点丢失了,只好reset log

1
2
$ sudo -u postgres ./pg_resetxlog /var/lib/postgresql/9.4/main/
Transaction log reset

如果不行,请加-f参数强制reset

然后再启动,提示:

1
2
3
4
5
2016-11-26 13:55:24 CST \[27330-1\] LOG: database system was shut down at 2016-11-26 13:54:28 CST
2016-11-26 13:55:24 CST \[27330-2\] PANIC: too many replication slots active before shutdown
2016-11-26 13:55:24 CST \[27330-3\] HINT: Increase max_replication_slots and try again.
2016-11-26 13:55:24 CST \[27329-1\] LOG: startup process (PID 27330) was terminated by signal 6: Aborted
2016-11-26 13:55:24 CST \[27329-2\] LOG: aborting startup due to startup process failure

因为以前添加了复制槽,现在max_replication_slots又设置成了0,所以出错了,重新修改配置文件:

1
2
archive_moe=archive
max_replication_slots=5

启动后删除replication slots:
[sql]
=> select pg_drop_replication_slot(‘slotname’);
[/sql]

这样关闭归档参数就没问题了。

再一次,永远不要手工删除postgresql数据目录下的文件,归档日志太多撑爆了硬盘,postgresql panic,是因为归档命令或者复制槽出问题了,因此数据库无法自动清理wal日志。
如果故障无法排除,可以首先将pg_xlog目录下的文件拷贝到其他地方,然后使用pg_archivecleanup命令来清理归档日志。

迫不得已,实在每办法了,再reset log,但是这时的数据库状态是不对的,不应该再使用了。如果有其他备份,请恢复这些备份。
没有的话,可以先pg_dump,然后停止数据库,重新initdb初始化数据库,然后再pg_restore。

References:
[1]How can I solve postgresql problem after deleting wal files?

===
[erq]

1
2
3
$ vim --version grep clipboard
-clipboard
-xterm_clipboard

debian系统终端下面的vim默认编译选项并不支持系统剪贴板,所以如果需要与系统剪贴板交互需要使用gvim,当然鼠标中键一直是可以用的,不过,用vim不就是为了丢掉效率地下的鼠标吗?

References:
[1]:help registers
[2]Vim中寄存器的使用
===
[erq]