<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHPK.org &#187; DB</title>
	<atom:link href="http://www.phpk.org/archives/tag/db/feed" rel="self" type="application/rss+xml" />
	<link>http://www.phpk.org</link>
	<description>PHP User Group</description>
	<lastBuildDate>Tue, 17 Jan 2012 17:17:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Lock wait timeout exceeded 에러</title>
		<link>http://www.phpk.org/archives/294</link>
		<comments>http://www.phpk.org/archives/294#comments</comments>
		<pubDate>Mon, 13 Jul 2009 18:38:23 +0000</pubDate>
		<dc:creator>ooti</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[데드락]]></category>
		<category><![CDATA[트랜젝션]]></category>

		<guid isPermaLink="false">http://www.phpkorea.org/archives/294</guid>
		<description><![CDATA[최근에 MySQL에 마이그레이션 작업을 위해 대량의 데이터를 입력하던 중에 갑자기 모든 데이터가 Rollback 되는 현상이 있었습니다. 로그에는 Lock wait timeout 라고 적혀 있었는데요. 간단히 이 메세지에 대해서 알아보겠습니다. 이 Lock wait timeout excceded 메세지는 DBMS가 트랜젝션을 위해 잠금(Lock)한 시간이 제한 시간을 넘었다는 것인데 설정 파일에서 값을 지정하지 않았다면 기본 값은 50초 입니다. 이 에러 메세지가 [...]]]></description>
			<content:encoded><![CDATA[<p>최근에 MySQL에 마이그레이션 작업을 위해 대량의 데이터를 입력하던 중에 갑자기 모든 데이터가 Rollback 되는 현상이 있었습니다. 로그에는 Lock wait timeout 라고 적혀 있었는데요. 간단히 이 메세지에 대해서 알아보겠습니다.</p>
<p>이 Lock wait timeout excceded 메세지는 DBMS가 트랜젝션을 위해 잠금(Lock)한 시간이 제한 시간을 넘었다는 것인데 설정 파일에서 값을 지정하지 않았다면 기본 값은 50초 입니다.</p>
<p>이 에러 메세지가 나타나는 경우는 두 가지가 있을 수 있습니다. 첫 번째는 deadlock 상태가 됐을 경우이고 두 번째는 너무 오랜 시간 lock 이 걸려있는 경우 입니다.</p>
<h3>첫 번째,</h3>
<p>MySQL에서 서로 다른 storage engine 을 사용하는 테이블 끼리 작업을 수행했을 때 deadlock 상태에 빠지기 쉽습니다. 예컨데 동일한 데이터베이스에 각기 다른 storage engine을 사용해 테이블을 구성했다면 MyISAM 엔진을 사용한 테이블은 table lock 이고 InnoDB 엔진을 사용한 테이블은 row lock 이기 때문에 이러한 테이블 간에 deadlock 이 쉽게 발생할 수 있습니다.</p>
<h3>두 번째,</h3>
<p>만약 100개의 데이터를 INSERT 한다면 일반적으로 맨 앞에 BEGIN 을 실행하고 마지막에 COMMIT 을 실행할 것입니다. 그런데 100개의 데이터가 아니라 1,000개, 10,000개의 데이터를 한번의 트랜젝션으로 INSERT 또는 UPDATE를 하려 한다면 기본 제한 시간인 50초를 넘을 수 있기 때문에 에러 메세지를 출력한 후 전부 Rollback 될 것입니다.</p>
<p>해결 방법은 두 가지가 있을 것 같은데요. 첫 번째는 my.ini ( 또는 my.cnf ) 설정 파일을 열고 innodb_lock_wait_timeout 값을 충분하게 늘려 주는 것입니다. 이 방법은 아주 간단하게 문제를 해결 할 수는 있지만 위에서 언급했던 deadlock 같은 상황이 발생하면 큰 문제가 될 수 있으므로 신중하게 고려해야 하는 방법인 것 같습니다. 두 번째 방법은 적당한 수만큼 SQL 쿼리를 나누어 실행하는 것입니다. 예를 들면 1,000개의 INSERT 쿼리라면 100개씩 나누어서 실행하는 것입니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090714-031712.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2009-07-14_031712" border="0" alt="2009-07-14_031712" src="http://blog.phpkorea.org/files/20090714-031712-thumb.jpg" width="516" height="295" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpk.org/archives/294/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL의 테이블 존재 여부 확인 방법</title>
		<link>http://www.phpk.org/archives/226</link>
		<comments>http://www.phpk.org/archives/226#comments</comments>
		<pubDate>Tue, 12 May 2009 04:53:22 +0000</pubDate>
		<dc:creator>ooti</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.phpkorea.org/archives/226</guid>
		<description><![CDATA[동적으로 DB 테이블을 생성해야 하는 경우가 있습니다. 예를 들면 월 단위로 로그 테이블을 생성해서 로그를 기록해야 하는 경우도 있을 테고요. 제로보드 같은 툴에서는 게시판을 생성하면 실제로 테이블을 하나 생성하여 글을 저장합니다. 이렇게 동적으로 DB 테이블을 생성할 때에는 생성하려는 테이블의 이름과 같은 이름의 테이블이 존재하는지 확인하는 과정이 필요합니다. 확인 과정 없이 테이블을 생성하려다가 실패했을 때 예상치 [...]]]></description>
			<content:encoded><![CDATA[<p>동적으로 DB 테이블을 생성해야 하는 경우가 있습니다. 예를 들면 월 단위로 로그 테이블을 생성해서 로그를 기록해야 하는 경우도 있을 테고요. 제로보드 같은 툴에서는 게시판을 생성하면 실제로 테이블을 하나 생성하여 글을 저장합니다.</p>
<p>이렇게 동적으로 DB 테이블을 생성할 때에는 생성하려는 테이블의 이름과 같은 이름의 테이블이 존재하는지 확인하는 과정이 필요합니다. 확인 과정 없이 테이블을 생성하려다가 실패했을 때 예상치 못한 버그가 나타날 수 있습니다.</p>
<p>테이블의 존재 여부를 확인하는 방법으로는 여러 가지 방법이 있겠습니다만 몇 가지 방법을 소개하려 합니다.</p>
<h2>SHOW TABLES</h2>
<p>첫 번째 방법은 한 줄의 SQL 쿼리로 테이블의 존재 여부를 알 수 있습니다. 일치하는 테이블이 있다면 테이블 명을 반환하고 그렇지 않은 경우라면 값이 없을 것입니다.</p>
<div>
<table style="border-collapse: collapse" border="0">
<colgroup>
<col style="width: 615px" /></col>
</colgroup>
<tbody>
<tr>
<td style="border-right: black 0.5pt solid; padding-right: 7px; border-top: black 0.5pt solid; padding-left: 7px; border-left: black 0.5pt solid; border-bottom: black 0.5pt solid"><span style="font-size: 10pt">SHOW TABLES FROM [DB명] LIKE &#8216;[TABLE명]&#8216;;</span></td>
</tr>
</tbody>
</table></div>
<p>이미 DB가 지정되어 있다면 아래와 같이 [DB명]을 생략할 수 있습니다.</p>
<div>
<table style="border-collapse: collapse" border="0">
<colgroup>
<col style="width: 615px" /></col>
</colgroup>
<tbody>
<tr>
<td style="border-right: black 0.5pt solid; padding-right: 7px; border-top: black 0.5pt solid; padding-left: 7px; border-left: black 0.5pt solid; border-bottom: black 0.5pt solid"><span style="font-size: 10pt">SHOW TABLES LIKE &#8216;[TABLE명]&#8216;;</span></td>
</tr>
</tbody>
</table></div>
<h2>Information_schema</h2>
<p>두 번째 방법은 MySQL의 Information_schema를 사용하는 방법입니다. 주의할 점은 information_schema 는 MySQL 5에서 추가되었기 때문에 MySQL 4 이하에서는 사용할 수 없습니다.</p>
<div>
<table style="border-collapse: collapse" border="0">
<colgroup>
<col style="width: 615px" /></col>
</colgroup>
<tbody>
<tr>
<td style="border-right: black 0.5pt solid; padding-right: 7px; border-top: black 0.5pt solid; padding-left: 7px; border-left: black 0.5pt solid; border-bottom: black 0.5pt solid"><span style="font-size: 10pt">SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = &#8216;[DB명]&#8216; AND table_name = &#8216;[TABLE명]&#8216;;</span></td>
</tr>
</tbody>
</table></div>
<p>COUNT( )함수를 사용했기 때문에 테이블이 존재하는 경우 1 , 존재하지 않는 경우 0 으로 결과값이 정확하게 나옵니다. 추가로 다음 코드처럼 Information_schema DB 를 사용하면 테이블의 상세 정보를 알 수도 있습니다.</p>
<div>
<table style="border-collapse: collapse" border="0">
<colgroup>
<col style="width: 615px" /></col>
</colgroup>
<tbody>
<tr>
<td style="border-right: black 0.5pt solid; padding-right: 7px; border-top: black 0.5pt solid; padding-left: 7px; border-left: black 0.5pt solid; border-bottom: black 0.5pt solid"><span style="font-size: 10pt">SELECT * FROM information_schema.tables WHERE table_schema = &#8216;[DB명]&#8216; AND table_name = &#8216;[TABLE명]&#8216;;</span></td>
</tr>
</tbody>
</table></div>
<p>SHOW TABLES는 테이블 명만 반환하는데 반해서 information_schema DB를 이용하면 테이블에 대한 상세한 정보까지 알 수 있다는 장점이 있습니다.</p>
<p>참고 : <a href="http://dev.mysql.com/doc/refman/5.0/en/information-schema.html">http://dev.mysql.com/doc/refman/5.0/en/information-schema.html</a></p>
<h2>CREATE TABLE IF NOT EXISTS</h2>
<p>이 방법은 테이블이 없는 경우에 테이블을 생성하게 합니다. 하지만 조금 주의해야 할 점은 혹시나 테이블 이름은 동일하지만 항목이 다른 경우라면 오류가 발생할 수 있습니다. 예를 들면 아래 두 개의 SQL 과 같은 경우 입니다.</p>
<p style="text-align: justify"><span style="font-size: 10pt"><strong>코드 1 members 1</strong></span></p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">TABLE</span> members ( id <span style="color: #0000ff">int</span> , name <span style="color: #0000ff">varchar</span>(10) ) </pre>
</div>
<p style="text-align: justify"><span style="font-size: 10pt"><strong>코드 2 members 2</strong></span></p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<pre id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">TABLE</span> <span style="color: #0000ff">IF</span> <span style="color: #0000ff">NOT</span> <span style="color: #0000ff">EXISTS</span> members ( id <span style="color: #0000ff">int</span> , email <span style="color: #0000ff">varchar</span>(45) )</pre>
</div>
<p>이미 코드 1에 해당되는 테이블이 존재 한다고 했을 때, 그 후 코드 2의 테이블을 생성하려 했으나 IF NOT EXISTS 옵션으로 인해 생성하지 않았다면 항목이 전혀 다르기 때문에 문제가 될 수 있으므로 주의해야 합니다. 이런 경우가 발생할 가능성이 있다면 첫 번째나 두 번째 방법을 이용해서 테이블의 존재 여부를 미리 파악해서 예외처리를 하는 것이 좋을 것 같습니다.</p>
<p>추가로 아래는 information_schema DB를 이용해서 테이블을 확인하는 PHP 함수코드 입니다.</p>
<p style="text-align: justify"><span style="font-size: 10pt"><strong>코드 3 테이블 존재 여부 확인 PHP 함수</strong></span></p>
<div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4; text-align: left">
<div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum1" style="color: #606060">   1:</span> <span style="color: #0000ff">function</span> table_exists($tablename, $database = <span style="color: #0000ff">false</span>) {</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum2" style="color: #606060">   2:</span>     <span style="color: #0000ff">if</span>(!$database) {</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum3" style="color: #606060">   3:</span>        $res = mysql_query(<span style="color: #006080">&quot;SELECT DATABASE()&quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum4" style="color: #606060">   4:</span>        $database = mysql_result($res, 0);</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum5" style="color: #606060">   5:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum6" style="color: #606060">   6:</span>     $res = mysql_query(<span style="color: #006080">&quot;</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum7" style="color: #606060">   7:</span>         SELECT COUNT(*) AS count</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum8" style="color: #606060">   8:</span>         FROM information_schema.tables</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum9" style="color: #606060">   9:</span>         WHERE table_schema = '$database'</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum10" style="color: #606060">  10:</span>         AND table_name = '$tablename'</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum11" style="color: #606060">  11:</span>     &quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"><span id="lnum12" style="color: #606060">  12:</span>     <span style="color: #0000ff">return</span> mysql_result($res, 0) == 1;</pre>
<p><!--CRLF--></p>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"><span id="lnum13" style="color: #606060">  13:</span> }</pre>
<p><!--CRLF--></p>
</p></div>
</div>
<p>코드 출처 : <a href="http://www.electrictoolbox.com/check-if-mysql-table-exists/php-function/">http://www.electrictoolbox.com/check-if-mysql-table-exists/php-function/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpk.org/archives/226/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  www.phpk.org/archives/tag/db/feed ) in 0.18813 seconds, on Feb 8th, 2012 at 8:06 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 8th, 2012 at 9:06 am UTC -->
