0%

sierra的terminal里,vim输入中文乱码了,百思不得其解,苦苦搜索后,发现一个线索,terminal的preferences- Profile - advanced - Input - Escape non-ASCII input with Control-V不要勾选,果然此选项被勾选了,去掉勾选汉字输入正常了. but,这选项不是我开启的啊~~~

Console Vim uses whatever font the console/terminal is using. Changing the font in your terminal is done differently depending on your system and the terminal in use.

输入:h feature-list查看vim支持的特性,然后可以在脚本中通过if has(“feature-name”)来检测该特性.

dblink是postgresql内置的一个扩展模块,支持从当前postgresql数据库连接到其他postgresql数据库来存取数据。
除dblink外,还可以使用postgres_fdw来访问外部postgresql,二者功能基本一致,但postgres_fdw更优。

dblink有一系列的函数,支持连接外部postgresql,执行select,insert,update,delete等语句,以及在外部数据库中执行命令。

创建

1
=> CREATE EXTENSION dblink;

会创建dblink相关的函数

使用

dblink的语法:
[sql]
dblink(text connname, text sql [, bool fail_on_error]) returns setof record
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record
[/sql]
dblink函数可以使用已有的连接,或者直接提供连接字符串来访问外部服务器

下面的语句直接提供连接串来访问外部postgresql的表:
[sql]
=> select id, land_using_type from dblink(‘host=192.168.0.9 dbname=pgdbname user=pguser password=passwd’,
‘select id, land_using_type from reg.tb_relevant_cert where cert_type=1’)
as t1 (id integer, land_using_type varchar(50));
[/sql]

使用dblink访问外部表数据,必须指定alias,下面是个综合的用法,用外部postgresql数据库的表更新本地表的数据:
[sql]
=> update reg.tb_relevant_cert c set land_using_type=t2.land_using_type
from
(select id, land_using_type from dblink(‘host=192.168.0.9 dbname=pgdbname user=pguser password=passwd’,
‘select id, land_using_type from reg.tb_relevant_cert where cert_type=1’)
as t1 (id integer, land_using_type varchar(50))
) as t2
where c.id=t2.id;
[/sql]

创建视图

每次写dblink比较麻烦,可以创建一个视图来简化此项工作:
[sql]
=> CREATE VIEW view_tbl_foo AS
select * from dblink(‘host=192.168.0.9 dbname=pgdbname user=pguser password=passwd’,
‘select id, land_using_type from reg.tb_relevant_cert where cert_type=1’)
as t1 (id integer, land_using_type varchar(50));
[/sql]

然后访问就比较简单了:
[sql]
=> SELECT * FROM view_tbl_foo;
[/sql]

References:
[1]F.10. dblink

===
[erq]

SQL/MED(SQL Management of External Data)是SQL与外部数据交互的标准,postgresql对此的支持就是FDW(Foreign Data Wrapper),可以支持各种各样的外部数据,从关系数据库、NoSQL数据库到文件,几乎涵盖了常见的各种数据源。有通用的支持关系数据库的FDW,比如JDBC_FDW,ODBC_FDW,也有针对特定数据库的FDW,比如postgres_fdw,oracle_fdw,mysql_fdw,也有对csv,json文件等的支持,file_fdw,josn_fdw。

postgresql的FDW不但支持查询,现在还可以支持insert,update,delete等操作,还可以下推(pushdown)where,group by,sort,join等。

References:
[1]Foreign data wrappers

===
[erq]

postgresql通过fdw(Foreign Data Wrapper)插件来支持各种各种的外部数据,外部文件和关系数据库都可以,通过插件oracle_fdw可以从postgresq来访问oracle数据库。

安装

安装postgresql开发库

1
# apt install postgresql-server-dev-all

安装oracle instant client,并配置好oracle环境变量,特别是ORACLE_HOME
特别注意要建几个符号链接:

1
2
3
4
$ cd /opt/oracle/instantclient_12_1
$ sudo ln -sf libclntsh.so.12.1 libclntsh.so
$ sudo ln -sf libclntshcore.so.12.1 libclntshcore.so
$ sudo ln -sf libocci.so.12.1 libocci.so

下载oracle_fdw源代码,解压,编译,安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ wget https://github.com/laurenz/oracle_fdw/archive/ORACLE_FDW_1_5_0.tar.gz
$ tar zxvf ORACLE_FDW_1_5_0.tar.gz
$ cd ORACLE_FDW_1_5_0
$ make
$ sudo make install
/bin/mkdir -p '/usr/lib/postgresql/9.4/lib'
/bin/mkdir -p '/usr/share/postgresql/9.4/extension'
/bin/mkdir -p '/usr/share/postgresql/9.4/extension'
/bin/mkdir -p '/usr/share/doc/postgresql-doc-9.4/extension'
/usr/bin/install -c -m 755 oracle_fdw.so '/usr/lib/postgresql/9.4/lib/oracle_fdw.so'
/usr/bin/install -c -m 644 oracle_fdw.control '/usr/share/postgresql/9.4/extension/'
/usr/bin/install -c -m 644 oracle_fdw--1.1.sql oracle_fdw--1.0--1.1.sql '/usr/share/postgresql/9.4/extension/'
/usr/bin/install -c -m 644 README.oracle_fdw '/usr/share/doc/postgresql-doc-9.4/extension/'

查看插件是否安装成功:

1
2
3
4
sql=> select * from pg_available_extensions ;
...
oracle_fdw 1.1 (null) foreign data wrapper for Oracle access
...

可以看到已经安装了插件oracle_fdw

创建扩展

确保运行postgresql的用户(一般为postgres)可以使用sqlplus正确链接到oracle数据库(其实只要当前系统用户正确连接到oracle即可)

1
$ sqlplus orauser/password@oradb

创建oracle_fdw

1
2
3
$ sudo -u postgres psql
postgres=# create extension oracle_fdw ;
ERROR: could not load library "/usr/lib/postgresql/9.4/lib/oracle_fdw.so": libclntsh.so.12.1: cannot open shared object file: No such file or directory

检查$LD_LIBRARY_PATH设置无误,但仍然找不到libclntsh.so.12.1,只好修改ld配置文件
添加/etc/ld.so.conf.d/oracle.conf

1
2
# oracle instant client
/opt/oracle/instantclient_12_1/

然后刷新ld缓存,

1
$ sudo ldconfig

重新创建oracle_fdw扩展成功。
为什么ldconfig可以而$LD_LIBRARY_PATH不行呢?因为

1
2
3
4
5
6
If you manually start the server, it will inherit the environment setting from your shell.
But if PostgreSQL is started from a startup script, e.g. when the machine is booted,
you will not have the environment setting, and things will suddenly stop working.

That's why I recommended to set the variables in the PostgreSQL startup script.
As I said before, using ldconfig is much better

更详细参见参考[2]

创建外部服务器、用户映射和外部表

创建外部oracle服务器
首先确保运行postgresql服务的用户(一般为postgres)可以通过sqlplus正确连接到配置的oracle数据库实例,比如此处的orcl

注意:要确保tnsname.ora文件位于默认的$ORACLE_HOME/network/admin目录下,指定$TNS_ADMIN环境变量是没用的。

1
postgres=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver 'oradb');

查看创建的外部服务器:

1
postgres=# select * from pg_foreign_server ;

还需要创建一个postgresql用户到oracle用户的映射表

1
postgres=# CREATE USER MAPPING FOR pguser SERVER oradb OPTIONS (user 'orauser', password 'orapwd');

删除用户映射:

1
postgres=# DROP USER MAPPING FOR postgres SERVER oradb;

如果不想在postgresql数据库中保存oracle的密码,可以将user后面的内容置空,从而使用外部密码方式。

创建外部表

1
2
3
4
5
postgres=# CREATE FOREIGN TABLE tb_ora_test (
id integer OPTIONS (key 'true') NOT NULL,
text character varying(30),
floating double precision NOT NULL
) SERVER oradb OPTIONS (schema 'ORASCHEMA', table 'ORATAB');

外部表的字段来自于指定的oracle表,字段数量可以少于oracle表的字段数量,也可以多于oracle表的字段数量,但多出来的字段只会返回空值。
然后就可以通过查询外部表来访问到oracle数据库表的内容,除了select,也可以insert,update,delete原始oracle表的内容。

授权其他用户使用外部oracle服务器

1
postgres=# GRANT USAGE ON FOREIGN SERVER oradb TO pguser;

References:
[1]PostgreSQL Foreign Data Wrapper for Oracle
[2]Why LD_LIBRARY_PATH is bad

===
[erq]

virtualbox的原生虚拟磁盘格式是vdi,也支持vmware的vmdk格式。virtualbox提供的工具vboxmanage支持vdi动态扩展磁盘的扩容。
对于vmdk格式可以先转换成vdi格式再行扩容,如果有必要扩容后可以转换回vmdk格式

虚拟硬盘扩容

1
2
3
$ vboxmanage clonehd "source.vmdk" "cloned.vdi" --format vdi
$ vboxmanage modifyhd "cloned.vdi" --resize 20480
$ vboxmanage clonehd "cloned.vdi" "resized.vmdk" --format vmdk //如果需要转换回原格式

客户系统扩容

上一个步骤只是扩展了虚拟磁盘的容量,客户操作系统还需要扩展分区才能利用新的容量。
linux客户系统可以使用GParted动态扩展分区
windows客户系统可以使用diskpart命令来扩展分区,但此命令不能扩展当前启动分区,如需扩展启动分区,可以用其他虚拟机启动,扩容后的磁盘作为附加磁盘。

然后运行cmd,执行diskpart

1
2
3
4
5
cmd> list disk // 查看磁盘
cmd> select disk 1 // disk后面的数值为扩容后磁盘的编号,从list disk中可以查到
cmd> list partition // 查看磁盘分区
cmd> select partition 0 // 根据list partition的显示,将0替换成C盘对应的分区号
cmd> extend // 扩容分区0

Refereces:
[1]VirtualBox扩容vmdk格式的Windows分区

===
[erq]

Tomcat 8.x 启动时有这样的warning:

1
2
3
4
5
6
7
8
9
10
25-Oct-2016 21:37:42.341 WARNING \[tafdc.net-startStop-1\] org.apache.catalina.webresources.Cache.getResource Unable to add the resource at \[/WEB-INF/conf/spring-activemq.xml\] to the cache because there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
```

只需在$CATALINA_BASE/conf/context.xml文件中,`/Context`之前添加如下行,增大默认的缓存容量:

```js
<Resources
cachingAllowed="true"
cacheMaxSize="102400"
/>

tomcat 默认的缓存只有10M

References:
[1]The Resources Component

===
[erq]

vim有一个选项autoread,可以自动重新读取当前正在缓冲区但其内容变化了的文件,一般来讲是因为外部程序修改了vim当前正在编辑的文件。
但是这个选项并不会自动加载变化之后的内容,只有特定的事件被触发时才会重新加载,比如执行外部命令,或者简单的执行vim内部命令:e

这一切都不是自动和实时的,所以有了这样一个插件auto_autoread.vim
下载auto_autoread.vim文件丢到~/.vim/plugin/目录下,打开一个文件,然后输入:

1
:Autoread 1

这样插件会后台周期性监视文件变化,这里设定的周期是1秒,当文件内容发生变化后会自动重新读取进来。

输入:

1
:AutoreadStop

停止监视文件变化。

这个功能应该由vim内部实现,vim主配置文件配置一下监视周期就好了。

References:
[1]auto_autoread.vim : Automatically read files when they’ve changed. Does what ‘autoread’ promises.
[2]auto_autoread.vim

===
[erq]