Octave 数值计算

环境: Ubuntu 12.04 ,  Octave 3.8.2

Octave是一个旨在提供与Matlab语法兼容的开放源代码科学计算数值分析的工具,它支持向量和矩阵计算,方便写数学表达式。

安装步骤如下:
wget ftp://ftp.gnu.org/gnu/octave/octave-3.8.2.tar.gz
tar xvf octave-3.8.2.tar.gz
cd octave-3.8.2
./configure
make
sudo make install

进入命令行:
jerry@hq:~$ octave
warning: docstring file ‘/usr/local/share/octave/3.8.2/etc/built-in-docstrings’ not found
No protocol specified
GNU Octave, version 3.8.2
Copyright (C) 2014 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type ‘warranty’.

Octave was configured for “x86_64-unknown-linux-gnu”.

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type ‘news’.

octave:1>

octave:28> version
ans = 3.8.2
octave:29> pi
ans =  3.1416
octave:30> A
A =

1   2
3   4

octave:31>

MySQL 导出导入二进制文件

环境:winXP, mysql, Redhat

在一次从RHEL 5 dump整个数据库并在winXP下恢复,由于有一个表包含图片数据,导致“’”分隔符被吞噬(由于二进制编码的问题,引号分隔符被当作了数据的一部分),从而使得数据不能被正常导入。造成整个数据库无法导入。

解决方法:1.  使用select [binary_column] into dumpfile ‘dump_dir’ from [table_name], 然后在命令行中insert into table(binary_column) values(load_file(‘dump_dir’)); 由于只能导出单行。用起来相当麻烦。

2.  使用select col1, col2, … , hex([binary_column])  into outfile ‘dump_dir’ from [table_name], 然后在命令行中导入load data infile ‘dump_dir’ into table [table_name], 最后将之前转化为十六制的字段再转为二进制 update [table_name] set [binary_column] = unhex([binary_column]),这样就完成导入过程。

MySQL 与OS交互

环境:RHEL 5,  MySQL 5

一直都以为mysql 不能像oracle/db2/sql server那样在存储过程或函数中执行操作命令,今天在网上发现有个lib_mysqludf_sys可以实现这种功能。这个库文件在http://www.mysqludf.org/lib_mysqludf_sys/index.php上。

解压后其中有一个库文件是lib_mysqludf_sys.so,将其中放到mysql的 –plug-dir目录下(ps -ef | grep mysql可以查到plug-dir 或 在mysql命令行中查询select @@plugin_dir;),重新启动mysql服务。进入mysql命令行中,选择mysql数据库,执行CREATE FUNCTION sys_eval RETURNS STRING SONAME ‘lib_mysqludf_sys.so’; 这样就可以执行OS命令了,mysql>select sys_eval(‘ls’);

MySQL一个有意思的问题

DELIMITER $$
DROP PROCEDURE IF EXISTS `p3` $$
CREATE PROCEDURE p3()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE table_name VARCHAR(255);
DECLARE stmt varchar(200);
DECLARE cur1 CURSOR FOR select table_name from information_schema.tables;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO table_name;
select table_name;
UNTIL done = 1
END REPEAT;
CLOSE cur1;
END $$
DELIMITER ;
查询出来的结果都为空, 最后发现变量table_name与游标定义中的table_name重复,修改变量table_name为其它的名字。 但具体内在的发生机制还不太清楚。

Greenplum gp_vmem_protect_limit 出错

运行的Greenplum报这个错:

‘53400’, ‘[53400] ERROR: Out of memory  (seg30 slice3 bbsod:40002 pid=26372)\\\\nVM Protect failed to allocate 8388608 bytes, 6 MB available;\\\\nError while executing the query (7)
psql进入查看show gp_vmem_protect_limit 为8096,单位是kb。重设这个参数: gpconfig -c gp_vmem_protect_limit -v 1048576并记住要重启服务gpstop -r

Greenplum集群挂掉后启动

环境:CentOS 5.7,  Greenplum database 4.1
昨天不知怎样原因Greenplum集群中某台segment server挂掉,造成整个集群数据无法查看,报错为“error failed to acquire resources on one or more segments”。后来使用gpstop关掉尝试重新启动却无法成功。 使用debug模式启动: gpstart -v ,最终发现这个segment server的文件/dev/urandom权限为crw——-造成无法读取和写入。最后修改文件权限chmod go+rwx

Greenplum存储过程使用分区表将进行全表扫描

环境:Greenplum Database 4.2.1.0 , RHEL 5.4
问题: 之前用存储过程转换数据,其中一个表做分区,里面的逻辑先是删除日期参数的数据,然后用外部表导入再转换。最近由于装载了很多数据,发现后续增量加载超慢。 后来发现是“删除日期参数的数据”这个操作造成的,删除某一天数据执行的是全表扫描。但在psql命令中分区键能过滤。
解决方法: 在网上找到一篇跟我碰到情况类似的
大意是有两种方式避免,1. 涉及分区表使用动态sql   2. 升级至postgresql 9.2  , 这两种方法显能对gp是不靠谱的,只能用动态sql了, 苦了我们这帮用存储过程做数据转换的开发者。