向斌 2015-08-19T00:59:42+00:00 bitzhuxb@sina.com mysql metadata lock 原因分析(草稿) 2015-08-18T00:00:00+00:00 向斌 http://bitzhuxb.github.io/2015/08/mysql-metadatalock-when-alter-is-runnging 事由

目前由于业务需求,需要对数据库进行ddl操作更改业务库的表结构,timeline如下: 1. 执行alter语句 2. 等了很久也没有成功,以为是表的数据量太大导致的。此时依赖于此表的业务系统不能正常访问。 3. 另一个窗口show processlist,发现了alter语句被锁,提示如下:

Waiting for table metadata lock 4. 发现有很多sleep的process将alter语句锁住,kill掉alter语句,系统恢复正常

原因分析

目前mysql为了保持数据的一致性使用了metadata locking,详情参考mysql官方文档:

metadata locking

具体原因是由于事务操作在尚未commit之前,如果有ddl对表结构做变更就会导致上面所说的错误,由于业务系统会有一些事务操作,而且部分事务保持的是长连接的方式,那么就会导致上面的alter语句执行被事务操作锁住。

方案

1.执行alter语句,直接等待解锁。但是会带来一个问题,业务系统在此时是无法使用的 2.使用权限高的账户去执行alter语句

]]>
PHP中多维数组的搜索 2015-04-11T00:00:00+00:00 向斌 http://bitzhuxb.github.io/2015/04/search-element-in-mutidimensional-array-in-php 我们在使用php的时候可能会遇到这样的问题,如果想从一个一维数组搜索某个值并返回其对应的key,那么可以使用array_search函数:

//在arr中搜索value
$arr = array("a"=>1,"b"=>2,"c"=>3);
$value = 3;
$key = array_search(3, $arr);

如果是一个多维的数组需要查找值为某个value的key,array_search是不能够完成这个目的的。可以将array_search 写成递归的形式:

function recursive_array_search($search_value,$arr) {
    foreach($arr as $key => $value) {
        $current_key = $key;
        if($search_value === $value){
            return $current_key;
        } elseif(is_array($value) && recursive_array_search($search_value,$value) !== false) {
            return $current_key;
        } 
    }
    return false;
}

该函数只返回最上层的key。更简单的可以使用逻辑运算符代替if,写法更加简单:

function recursive_array_search($search_value,$arr) {
    foreach($arr as $key => $value) {
        $current_key = $key;
        if($search_value === $value or (is_array($value) && recursive_array_search($search_value,$value) !== false)) {
            return $current_key;
        } 
    }
    return false;
}
 注意该函数只返回最外层的key,同时return false 只在最后返回(遍历完成之后)
]]>