Orzdba's Blog

Think then do it…

【Perl】fork子进程

leave a comment »

Perl中可以通过fork函数来创建一个子进程。如果fork成功的话,这个时候就存在父进程和子进程,接下来2个进程会同时开始执行perl脚本中fork函数后面的代码。例子如下:

#!/usr/local/bin/perl
use Term::ANSIColor;
use strict;
use warnings;
$SIG{CHLD} = ‘IGNORE’; #忽略SIGCHLD信号,回收僵尸子进程
print color(‘green’),”Program started… pid = $$ \n\n”;
print “fork process…\n”;
# 如果fork失败,则返回undefined
defined ( my $child = fork() ) or die “Fork Error : $!\n” ;
# 如果fork成功:
# 如果是父进程,则把生成的子进程PID赋值给$child。
# 如果是子进程,则把0赋值给$child。
if ($child == 0){
print color(‘yellow’),”\n-> child process running …\n”;
print “child process pid : $$ !\n”;
# 退出子进程,如果前面没有对子进程处理的话,那么在父进程还没退出期间,子进程就变成僵尸子进程。
exit 0;
} else {
print color(‘blue’),”\n-> parent process running …\n”;
print “child process pid : $child ; parent process pid : $$ !\n”,color(‘reset’);
}
#sleep(10);
print “\nHello World!\n”;

执行结果如下:

Read the rest of this entry »

Written by orzdba

四月 8, 2011 at 12:58 pm

Posted in Perl

Tagged with ,

【MySQL】LOAD DATA

leave a comment »

在使用LOAD DATAMySQL的时候,有2种情况:

1)在远程客户端(需要添加选项:–local-infile=1)导入远程客户端文本到MySQL,需指定LOCAL(默认就是ignore,ignore选项会放弃数据,加replace选项会更新数据,都不会出现唯一性约束问题。

2)在本地服务器导入本地服务器文本到MySQL,不指定LOACL,出现唯一性约束冲突,会失败回滚,数据导入不进去,这个时候就需要加ignore或者replace来导入数据。

测试如下:

Read the rest of this entry »

Written by orzdba

三月 17, 2011 at 12:51 am

Posted in MySQL

Tagged with ,

【MySQL】关于table cache的相关参数

leave a comment »

一、状态值和变量:

1.1

在MySQL的show status中有2个状态值:Open_tablesOpened_tables。这2个值代表的意思如下:

Open_tables  :代表当前打开表的数量。

Opened_tables:代表自从MySQL启动后,打开表的数量。

关于MySQL怎么打开关闭表的具体细节参考文档:<How MySQL Opens and Closes Tables>。

(1)对于myisam存储引擎,打开1张表需要2个文件描述符(一个.MYD文件,一个.MYI文件)。

(2)对于innodb存储引擎,开启表的独立表空间(innodb_file_per_table)打开1张表只需要1个文件描述符(一个.ibd文件)。

【MySQL Variable】

对于上面的状态值,对应的5.1.3版本后的MySQL变量参数为table_open_cache,而早期版本为:table_cache,该参数值的代表MySQL可以缓存的打开表时候的最大文件描述符

Read the rest of this entry »

Written by orzdba

三月 15, 2011 at 12:51 pm

Posted in MySQL

Tagged with , ,

【Linux】free命令

leave a comment »

记录linux下,free命令的执行结果的意思:
[zhuxu@xentest8-vm1 ~]$ free
total       used       free     shared    buffers     cached
Mem:       4194304    4164812      29492          0     248892    2148968
-/+ buffers/cache:    1766952    2427352
Swap:       524280     343820     180460
(1)第一行(Mem)中,
total:代表总的内存大小。
used :代表已经使用的内存大小,其中buffers和cached的值已经包含在used里面。
free :代表未分配使用的内存大小。
其中:
total = used + free = 4164812 + 29492 = 4194304
这边的used可以理解为从操作系统层面使用的内存大小(包括缓存)。

Written by orzdba

三月 10, 2011 at 1:12 pm

Posted in Linux & Unix

Tagged with ,

【Linux】内存段页式管理笔记

with one comment

Written by orzdba

三月 8, 2011 at 7:22 pm

Posted in Linux & Unix

【MySQL】Innodb的多版本一致性读

leave a comment »

在前面Innodb事务隔离级别中可以看到,在Innodb默认的的重复读(repeatable read)事物隔离级别下,可以实现重复读。和串行读(serializable)事物隔离级别实现重复读不同的是,串行读(serializable)为实现重复读,会在SELECT的时候隐式的对行添加共享读锁。而Innodb在实现过程并不对行加锁,而是通过使用多版本并发控制(MVCC,Multiviersion Concurrency Control)的技术来实现Consistent Nonlocking Reads

关于Innodb的多版本一致性读的实现机制和Oracle的实现很类似,都是通过rollback segment来实现的,具体如下说明:

1、rollback segment的存放位置

在Innodb的逻辑存储结构中也有表空间tablespace/segment/extent的概念,具体结构层次见下图(图片来自<InnoDB Internals: InnoDB File Formats and Source Code Structure>)。默认情况下,所有的数据都放到共享表空间ibdata1中,如果启用了参数innodb_file_per_table的话,每张表内的数据可以放到自己独立的放到一个表空间中。不管是否开启该参数,rollback segment都是存放在共享表空间中。

Read the rest of this entry »

Written by orzdba

三月 8, 2011 at 1:17 am

Posted in MySQL

Tagged with ,

【MySQL】Innodb事务隔离级别

with one comment

一、事务隔离级别

ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。

对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。

3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。

不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:

隔离级别 脏读 非重复读 幻像读
read uncommitted 允许 允许 允许
read committed 允许 允许
repeatable read 允许
serializable

二、数据库中的默认事务隔离级别

在Oracle中默认的事务隔离级别是提交读(read committed)。

对于MySQL的Innodb的默认事务隔离级别是重复读(repeatable read。可以通过下面的命令查看:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

+———————–+—————–+

| @@GLOBAL.tx_isolation | @@tx_isolation  |

+———————–+—————–+

| REPEATABLE-READ | REPEATABLE-READ |

+———————–+—————–+

1 row in set (0.00 sec)

下面进行一下测试:

Read the rest of this entry »

Written by orzdba

三月 3, 2011 at 12:36 am

Posted in MySQL

Tagged with ,

【Perl】安装Perl的DBI和DBD:mysql模块

with one comment

首先,来一段代码来自NinGoo的检测系统中已经按照的Perl模块:

[zhuxu@xentest9-vm1 ~]$ cat ./check_module.pl
#!/usr/bin/perl
use ExtUtils::Installed;
my $inst = ExtUtils::Installed->new();
print join “\n”,$inst->modules();
print “\n”;
[zhuxu@xentest9-vm1 ~]$
[zhuxu@xentest9-vm1 ~]$ ./check_module.pl
Perl
手动安装模块一般步骤只要到CPAN查找下载模块包,然后:[生成makefile] perl Makefile.PL [建立模块] make [测试模块] make test [安装模块] make install 。
下面进行Perl的DBI和DBD:mysql模块的安装,模块安装在自定义目录下:
Read the rest of this entry »

Written by orzdba

二月 24, 2011 at 8:26 pm

Posted in Perl

Tagged with ,

【Shell】awk列汇总/正则匹配变量

leave a comment »

记录一下,本周工作中用到的Shell处理脚本:

eg1:AWK匹配列汇总:
– (1)
[zhuxu@dbadb1 tmp]$ cat temp.log | grep “Query OK” |head
Query OK, 21401 rows affected (10.00 sec)
Query OK, 15560 rows affected (1.40 sec)
Query OK, 23588 rows affected (14.07 sec)
Query OK, 15249 rows affected (1.80 sec)
Query OK, 22519 rows affected (13.02 sec)
Query OK, 15535 rows affected (1.51 sec)
Query OK, 23665 rows affected (12.40 sec)
Query OK, 15676 rows affected (1.57 sec)
Query OK, 24608 rows affected (12.65 sec)
Query OK, 15159 rows affected (1.85 sec)
– (2)
[zhuxu@dbadb1 tmp]$ cat temp.log | grep “Query OK” | awk -F”[ (]” ‘BEGIN{rows=0;times=0} {rows+=$3;times+=$7} END{print “\nTotal rows: “rows,”\nTotal Times(min): “times/60″\n”}’
Total rows: 9990253
Total Times(min): 76.8903
[zhuxu@dbadb1 tmp]$
eg2:AWK列分组GRUP BY汇总SUM:
$head zx.log
2011-01-19      10
2011-01-19      10
2011-01-19      100
2011-01-19      1042
2011-01-19      10422
2011-01-19      1059
2011-01-19      1059
2011-01-19      10887
2011-01-19      1140
2011-01-19      11724
$awk ‘{name[$1]+=$2;sum+=$2} END {for(i in name) print i,name[i];print “=====> Total:”,sum,”<=====”;}’ zx.log | sort -k1 -M
2011-01-19 496582
2011-01-20 1039690
2011-01-21 364867
2011-01-22 1200747
2011-01-23 112981
2011-01-24 465766
2011-01-25 1081170
2011-01-26 1111863
2011-01-27 335430
2011-01-28 450190
2011-01-29 120003
2011-01-30 99402
2011-01-31 262238
2011-02-01 240861
2011-02-02 181618
2011-02-03 145767
2011-02-04 133216
2011-02-05 100355
2011-02-06 99856
2011-02-07 138638
2011-02-08 142822
2011-02-09 511951
2011-02-10 496962
2011-02-11 669015
2011-02-12 1750215
2011-02-13 629162
=====> Total: 12381367 <=====
eg3:脚本正则匹配变量:
#!/usr/local/bin/bash
# Func : Match
v_host=abcdef123.cm3.cm4
if [[ $v_host =~ '\.cm3$' ]] ; #查看变量是否以”.cm3″字符串结束。
then
echo ‘This is cm3!’;
elif [[ $v_host =~ '\.cm4$' ]] ;
then
echo ‘This is cm4!’;
else
echo ‘Error! Wrong Host’;
fi

Written by orzdba

十一月 28, 2010 at 5:07 pm

Posted in Linux & Unix

Tagged with , ,

【MySQL】INSERT … ON DUPLICATE KEY UPDATE/REPLACE

with one comment

INSERT … ON DUPLICATE KEY UPDATE/REPLACE都可以处理插入一条记录碰到主键或唯一性约束冲突的情况,不过2者的实现方式不同:
1、INSERT … ON DUPLICATE KEY UPDATE方式遇到冲突会update一下。
2、REPLACE方式遇到冲突会把原来的记录delete,然后再insert进去。

具体见下面的测试:

– (1)表结构和数据

mysql>show create table test\G;

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`pk_col` int(11) NOT NULL AUTO_INCREMENT,

`uk_col` int(11) DEFAULT NULL,

`col` varchar(10) DEFAULT NULL,

PRIMARY KEY (`pk_col`),

UNIQUE KEY `uk_test` (`uk_col`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

1 row in set (0.00 sec)

mysql>select * from test;

+——–+——–+——+

| pk_col | uk_col | col  |

+——–+——–+——+

|      1 |      1 | a    |

|      2 |      2 | b    |

|      3 |      3 | c    |

+——–+——–+——+

3 rows in set (0.00 sec)

– (2)插入重复值

mysql>insert into test(uk_col,col) values(3,’d');

ERROR 1062 (23000): Duplicate entry ’3′ for key ‘uk_test’

– (3)on duplicate key update方式插入,这时候记录的自增主键值不变,其他字段更新。

mysql>insert into test(uk_col,col) values(3,’d') on duplicate key update col=’d';

Query OK, 2 rows affected (0.00 sec)

mysql>select * from test;

+——–+——–+——+

| pk_col | uk_col | col  |

+——–+——–+——+

|      1 |      1 | a    |

|      2 |      2 | b    |

|      3 |      3 | d |

+——–+——–+——+

3 rows in set (0.00 sec)

– (4)replace方式插入,这时候记录的自增主键值改变,原记录被删除。pk_col变成6不是4,是由于上次2次insert语句,导致auto_crement增加。

mysql>replace test(uk_col,col) values(3,’d');

Query OK, 2 rows affected (0.00 sec)

mysql>select * from test;

+——–+——–+——+

| pk_col | uk_col | col  |

+——–+——–+——+

|      1 |      1 | a    |

|      2 |      2 | b    |

|      6 |      3 | d |

+——–+——–+——+

Written by orzdba

十一月 28, 2010 at 4:48 pm

Follow

Get every new post delivered to your Inbox.