【Perl】fork子进程
Perl中可以通过fork函数来创建一个子进程。如果fork成功的话,这个时候就存在父进程和子进程,接下来2个进程会同时开始执行perl脚本中fork函数后面的代码。例子如下:
#!/usr/local/bin/perluse Term::ANSIColor;use strict;use warnings;$SIG{CHLD} = ‘IGNORE’; #忽略SIGCHLD信号,回收僵尸子进程print color(‘green’),”Program started… pid = $$ \n\n”;print “fork process…\n”;# 如果fork失败,则返回undefineddefined ( 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”;
执行结果如下:
【MySQL】LOAD DATA
在使用LOAD DATA到MySQL的时候,有2种情况:
(1)在远程客户端(需要添加选项:–local-infile=1)导入远程客户端文本到MySQL,需指定LOCAL(默认就是ignore),加ignore选项会放弃数据,加replace选项会更新数据,都不会出现唯一性约束问题。
(2)在本地服务器导入本地服务器文本到MySQL,不指定LOACL,出现唯一性约束冲突,会失败回滚,数据导入不进去,这个时候就需要加ignore或者replace来导入数据。
测试如下:
【MySQL】关于table cache的相关参数
一、状态值和变量:
1.1
在MySQL的show status中有2个状态值:Open_tables和Opened_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可以缓存的打开表时候的最大文件描述符。
【Linux】free命令
[zhuxu@xentest8-vm1 ~]$ freetotal used free shared buffers cachedMem: 4194304 4164812 29492 0 248892 2148968-/+ buffers/cache: 1766952 2427352Swap: 524280 343820 180460
【MySQL】Innodb的多版本一致性读
在前面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都是存放在共享表空间中。

【MySQL】Innodb事务隔离级别
一、事务隔离级别
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)
下面进行一下测试:
【Perl】安装Perl的DBI和DBD:mysql模块
首先,来一段代码来自NinGoo的检测系统中已经按照的Perl模块:
[zhuxu@xentest9-vm1 ~]$ cat ./check_module.pl#!/usr/bin/perluse ExtUtils::Installed;my $inst = ExtUtils::Installed->new();print join “\n”,$inst->modules();print “\n”;[zhuxu@xentest9-vm1 ~]$[zhuxu@xentest9-vm1 ~]$ ./check_module.plPerl
【Shell】awk列汇总/正则匹配变量
记录一下,本周工作中用到的Shell处理脚本:
– (1)[zhuxu@dbadb1 tmp]$ cat temp.log | grep “Query OK” |headQuery 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: 9990253Total Times(min): 76.8903[zhuxu@dbadb1 tmp]$
$head zx.log2011-01-19 102011-01-19 102011-01-19 1002011-01-19 10422011-01-19 104222011-01-19 10592011-01-19 10592011-01-19 108872011-01-19 11402011-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 -M2011-01-19 4965822011-01-20 10396902011-01-21 3648672011-01-22 12007472011-01-23 1129812011-01-24 4657662011-01-25 10811702011-01-26 11118632011-01-27 3354302011-01-28 4501902011-01-29 1200032011-01-30 994022011-01-31 2622382011-02-01 2408612011-02-02 1816182011-02-03 1457672011-02-04 1332162011-02-05 1003552011-02-06 998562011-02-07 1386382011-02-08 1428222011-02-09 5119512011-02-10 4969622011-02-11 6690152011-02-12 17502152011-02-13 629162=====> Total: 12381367 <=====
#!/usr/local/bin/bash# Func : Matchv_host=abcdef123.cm3.cm4if [[ $v_host =~ '\.cm3$' ]] ; #查看变量是否以”.cm3″字符串结束。thenecho ‘This is cm3!’;elif [[ $v_host =~ '\.cm4$' ]] ;thenecho ‘This is cm4!’;elseecho ‘Error! Wrong Host’;fi
【MySQL】INSERT … ON DUPLICATE KEY UPDATE/REPLACE
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 |
+——–+——–+——+