Untitled Post - 173
sierra的terminal里,vim输入中文乱码了,百思不得其解,苦苦搜索后,发现一个线索,terminal的preferences- Profile - advanced - Input - Escape non-ASCII input with Control-V不要勾选,果然此选项被勾选了,去掉勾选汉字输入正常了. but,这选项不是我开启的啊~~~
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]
除了oracle_fdw,还可以通过其他fdw来访问oracle数据库,比如jdcb_fdw,可以参考“在PostgreSQL中使用jdbc_fdw访问Oracle”
postgresql通过fdw(Foreign Data Wrapper)插件来支持各种各种的外部数据,外部文件和关系数据库都可以,通过插件oracle_fdw可以从postgresq来访问oracle数据库。
安装
安装postgresql开发库
1 | # apt install postgresql-server-dev-all |
安装oracle instant client,并配置好oracle环境变量,特别是ORACLE_HOME
特别注意要建几个符号链接:
1 | $ cd /opt/oracle/instantclient_12_1 |
下载oracle_fdw源代码,解压,编译,安装:
1 | $ wget https://github.com/laurenz/oracle_fdw/archive/ORACLE_FDW_1_5_0.tar.gz |
查看插件是否安装成功:
1 | sql=> select * from pg_available_extensions ; |
可以看到已经安装了插件oracle_fdw
创建扩展
确保运行postgresql的用户(一般为postgres)可以使用sqlplus正确链接到oracle数据库(其实只要当前系统用户正确连接到oracle即可)
1 | $ sqlplus orauser/password@oradb |
创建oracle_fdw
1 | $ sudo -u postgres psql |
检查$LD_LIBRARY_PATH设置无误,但仍然找不到libclntsh.so.12.1,只好修改ld配置文件
添加/etc/ld.so.conf.d/oracle.conf
1 | # oracle instant client |
然后刷新ld缓存,
1 | $ sudo ldconfig |
重新创建oracle_fdw扩展成功。
为什么ldconfig可以而$LD_LIBRARY_PATH不行呢?因为
1 | If you manually start the server, it will inherit the environment setting from your shell. |
更详细参见参考[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 | postgres=# CREATE FOREIGN TABLE tb_ora_test ( |
外部表的字段来自于指定的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 | $ vboxmanage clonehd "source.vmdk" "cloned.vdi" --format vdi |
客户系统扩容
上一个步骤只是扩展了虚拟磁盘的容量,客户操作系统还需要扩展分区才能利用新的容量。
linux客户系统可以使用GParted动态扩展分区
windows客户系统可以使用diskpart命令来扩展分区,但此命令不能扩展当前启动分区,如需扩展启动分区,可以用其他虚拟机启动,扩容后的磁盘作为附加磁盘。
然后运行cmd,执行diskpart
1 | cmd> list disk // 查看磁盘 |
Refereces:
[1]VirtualBox扩容vmdk格式的Windows分区
===
[erq]
Tomcat 8.x 启动时有这样的warning:
1 | 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 |
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]