轉貼:Mysql 的Row Lock 與 Table Lock

資料來源Neo’s Blog

先前介紹過 SELECT … FOR UPDATE 的用法,不過鎖定(Lock)的資料是判別就得要注意一下了。由於 MyISAM 預設是 Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住)。
舉個例子:

假設有個表單 products ,裡面有 id 跟 name 二個欄位,id 是主鍵。

例1: (明確指定主鍵,並且有此筆資料,row lock)

SELECT * FROM products WHERE id=’3′ FOR UPDATE;

例2: (明確指定主鍵,若查無此筆資料,無 lock)

SELECT * FROM products WHERE id=’-1′ FOR UPDATE;

例2: (無主鍵,table lock)

SELECT * FROM products WHERE name=’Mouse’ FOR UPDATE;

例3: (主鍵不明確,table lock)

SELECT * FROM products WHERE id<>’3′ FOR UPDATE;

例4: (主鍵不明確,table lock)

SELECT * FROM products WHERE id LIKE ‘3’ FOR UPDATE;

註1:
FOR UPDATE 僅適用於 MyISAM,且必須在交易區塊(BEGIN/COMMIT)中才能生效。

註2:
要測試鎖定的狀況,可以利用 MySQL 的 Command Mode ,開二個視窗來做測試。

如果是使用Appserver環境,請把Mysql服務停下來,打開my.ini,找到skip-innodb,前面加上註解變成
#skip-innodb

重新啟動服務,就可以在資料儲存引擎中找到innodb的選項,就可以進行lock table/lock row的功能。

ARCHLinux再探

前幾天用自己的老機器在公司測試ArchLinux,因為很多網友推薦,這是一套很彈性,效能好,又不吃資源的Linux作業系統,而且針對i686的CPU進行編譯,所以就算是新機器,也有支援。

公司那台舊電腦是AMD 散步龍的3000+、RAM1G、HD Sata1 80G(這個規格超屌~哈),怎麼裝就是裝不起來,手邊又有事情在忙,所以就丟下來沒有處理。 Read more

dotproject php mysql問題

安裝完Cent OS 5.4版,再經過yum更新之後的PHP版本 5.1.6,但是我花了很久的時間
dotproject專案管理軟體2.1.3怎麼安裝就是有問題,最後降級使用2.1.2/2.1.1版的DotProject,但是這兩個版本有安全上的問題,而且我Run完之後,有出現操作上異常的Bug。
可以在CeontOS5.4版上怎麼安裝就是有問題,還好,我還有一台不是這麼重要的Linux主機,就拿來做實驗。

Read more

php與mysql套件問題,影響wordpress 運作

當mysql啟動、httpd啟動後,去run worpdress,結果出現「Your PHP installation appears to be missing the MySQL extension which is required by WordPress.」

我的解決方法如下

訊息是說少了一套php與mysql相關的套件,我記得有一個套件叫php-mysql,所以就用yum來安裝一下。指令如下
yum install php-mysql
service httpd restart
service mysqld restart

下完這些指令之後,就可以正常連線資料庫,如果出現連線失敗訊息
Error establishing a database connection
那就是帳號密碼的問題,請自行修改。

mysql資料庫亂碼問題處理

如果你用的php+mysql系統夠多,一定會遇到亂碼的問題,網路上有一堆解法,但是這些是對的嗎?不知道,我照了幾篇來做,就是有問題。

有一些國外的系統,使用的編碼方式是latin1,字集是用latin1_swedish_ci,結果系統運作的時候是正常的,但是如果系統出了問題,要從phpmyadmin進去維護,就會一個頭3個大。有人說這是因為在latin1編碼中存入big5字型的關係,結果我測試的結果,是在latin1中存入了utf8中文字,所以沒有辦法正常的顯示。因為不是所有的環境都可以透修改my.ini來達成,所以就要繞道而行。

先來證明一下假設好了,下一下sql指令,看一下資料庫中用了那些字集(編碼方式)
SHOW VARIABLES LIKE ‘character_set%’;
再來看一下是用了字集中的哪些字
SHOW VARIABLES LIKE ‘collation%’;

mysql中的操作指令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;

mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;

SET NAMES ‘utf8’;
等於下面三個指令
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

好咧,就來看一下在php結合mysql中 要怎麼處理,可以使用下面的指令
mysql_query(‘SET CHARACTER SET utf8’);
mysql_query(‘SET NAMES utf8’);
mysql_query(‘SET COLLATION_CONNECTION utf8’);
mysql_query(‘SET COLLATION_DATABASE latin1’);

接著,就出現正常的內容囉!怎麼實際透過php操作mysql,還有一點技巧,我在這裡就不說了,想知道的留言問,免得被別人整篇抄去。

機車老外 讓我氣的想罵髒話

前面講到,我因為免費的烏克蘭域名被砍,所以我只好把網站移到另一個hosting的站,應該說parking過去,在經過24小時之後,dns已經可以mapping的到,但是資料的匯入,卻遇到問題。

因為我的mysql資料庫有33MB左右的大小,dump出來之後,也有9MB多的tar.gz壓縮檔,如果用mysql去匯入的話,在上傳9mb的資料時,早就timeout了(如果上傳頻寬不夠大,保證一定timeout),所以怎麼匯都匯不進去,而且很多hosting網站會限制匯入的檔案不能大於2MB(還好他們開到10MB,所以可以上傳)。因為不是第一次搬家了,之前搬家都可以請hosting網站的工程師幫我透過ftp上傳好的dump檔匯入,就不會有timeout的問題,結果,一封信回來,跟我說他們不支援這樣的動作(已經花了十幾個小時),如果要請他們匯入的話,要收我10塊美金,靠北邊走,指令我會下,問題是我連不進去啊,之前我就請他們工程師做過了匯入的動作(匯入快500mb的資料),現在跟我說不支援,他們希望我自己可以透過ssh的方式,自己下指令,老實說,我早就試過ssh的方式,cpanel上面的教學跟本和實際的版本對不起來,金鑰和公鑰都設定好,也在putty上匯入成功,但是我從來沒有成功過,真想用三字經問候他們爸媽。

最後怎麼做,從原網站的控制面版進去,分table去dump資料庫,分別建了一個4MB一個5mb的檔案,分別import進phpmyadmin,再改一下相關的設定(資料庫連線以及網站絕對位址等)結果就可以了。

我很難想像,如果一個人不敢和老外溝通,技術性的內容又懂的不多時,他們怎麼來做搬家的動作,所以架站簡單,但是要好好的長期維護,還是有一點難度的。