2006년 10월 12일 목요일

database table 모두 최적화하기

서버에 Mysql 데이터 양이 많이 쌓이고, 쿼리 작업이 활발히 일어날경우,
이에 따른 db 의 공간 부담율도 커지게 됩니다.

이에 따라, 양이 많을 경우 하나하나 최적화를 해줄수도 없고,
아래와 같이 간략하게 쉘을 돌려봤습니다.
전엔 php 쉘로 돌렸는데 다소 느린것 같더군요.
bash 로 변경해 봤습니다.

혹, 필요하신분들 있으시면 가져다가, 쓰세요.
화일명으로 저장후 실행권한 주시고, /etc/cron.daily 에 넣어 주세요.
하루에 한번씩 돌리면 좋을듯 하네요.

조금이라도 도움이 되었으면 하는 바램으로....

-----------------------------------------------------------------

#!/bin/sh
# 2004/03/20
# http://www.rootman.co.kr
# 제목 : mysql Database 테이블 모두 최적화하기
# 변경사항 : mysql root 변경
# --------------------------------------------------
#
DB_cnt=0;
DB_pass="루트패스워드"
Total_Table=0;
DB_str=`mysql -u root -p${DB_pass} -e"show databases"`;
for DB_for in ${DB_str}
do
  if [ ${DB_for}  != "Database" ]; then
     TABLE_cnt=0;
     Table_str=`mysql -u root -p${DB_pass} -e"show tables" ${DB_for}`;
     for TABLE_for in ${Table_str}
     do
        Op_Str=`mysql -u root -p${DB_pass} -e"optimize table $TABLE_for" ${DB_for}`;
        echo " - DB명 : ${DB_for} --> ${TABLE_for} ";
        let TABLE_cnt=TABLE_cnt+1;
     done
     echo "------------------------------------------> 테이블명 : ${TABLE_cnt} 최적화완료.";
     let Total_Table=Total_Table+${TABLE_cnt};
     sleep 1;
     let DB_cnt=DB_cnt+1;
  fi;
done
echo "====================================================================================";
echo "- 호스트명 : `hostname` 에 대한 DB ${DB_cnt}개, 토탈테이블 ${Total_Table} 최적화 완료.";
echo "====================================================================================";

 

php 버전 입니다.

<html>
<title>데이터 베이스 최적화</title>
<head>
<style>
td {
font-size : 9pt;
}
</style>
</head>

<body>
<center>

<table width="500" cellpadding="3" cellspacing="0" border="0" bgcolor="#efefef">
<tr>
<td align="center">

<table width="100%" cellpadding="2" cellspacing="0" style="border: 1px #cccccc solid" bgcolor="#ffffff">
<tr>
<td style="padding : 10 10 10;" align="center"><B>MySQL 최적화</B></td>
</tr>
</table>

</td>
</tr>
</table>

<br><br>

<?php

// 기본 설정
$host = "localhost";
$user = "root";
$pass = "pass";
$dbcon = mysql_connect($host, $user, $pass) or die(mysql_error());

// 디비 리스트
$que = "show databases";
$result = mysql_query($que, $dbcon) or die(mysql_error());

// 디비별로 최적화 실행
while($db = mysql_fetch_array($result)) {
?>

<table width="500" border="0" cellpadding="2" cellspacing="0" bgcolor="#dddddd">
<tr>
<td bgcolor="#ffffff"><b><?=$db[0]?></b></td>
</tr>
</table>

<table width="500" border="0" cellpadding="2" cellspacing="1" bgcolor="#999999">
<colgroup>
<col width="*">
<col width="100">
</colgroup>

<?php
// 테이블 최적화 실행
$que = "show tables";
$tmp = mysql_db_query($db[0], $que, $dbcon) or die(mysql_error());
while($table = mysql_fetch_array($tmp)) {
$que = "OPTIMIZE TABLE ".$table[0];
mysql_query($que, $dbcon) or die(mysql_error());
?>

<tr bgcolor="#ffffff">
<td style="padding-left:30"><?=$table[0]?></td>
<td align="center">최적화 완료</td>
</tr>

<?php
}
?>

</table>

<br><br>

<?php
flush();
}
?>

</body>
</html>

 

PHP 스크립트이고 Cron을 이용하여 새벽에 돌려줍니다.
Optimize가 필요한 테이블만 실행시키고 실행결과는 메일로 전송됩니다.

<pre>
#!/usr/local/php/bin/php
<?
echo date("Y-m-d H:i:s")."\n";
$conn = mysql_connect("localhost", "root", "password") or die("MySQL Connection error!");
$DB = mysql_query("SHOW DATABASES", $conn) or die("Query error : SHOW DATABASES");
while($db = mysql_fetch_row($DB))
{
$que = "SHOW TABLE STATUS FROM ".$db[0];
$ST = mysql_query($que, $conn) or die("Query error : ".$que);
while($st = mysql_fetch_array($ST))
{
if($st['Data_free'] == 0) continue;
$tbl = $db[0].".".$st['Name'];
$que = "OPTIMIZE TABLE ".$tbl;
mysql_query($que, $conn) or die("Query error : ".$que);
echo $tbl;
for($i = 0; $i < 40 - strlen($tbl); $i ++) echo " ";
echo "\t";
for($i = 0; $i < 9 - strlen($st['Data_free']); $i ++) echo " ";
echo $st['Data_free']." OPTIMIZED\n";
}
}
mysql_close($conn);
echo "\n\n";
?>
</pre>



출처 : http://blog.naver.com/farmstay/2579875

댓글 없음:

댓글 쓰기