세이박스

MSSQL 작업스케줄러로 반복 적으로 쿼리 실행하기

데이타베이스
최근 스크립트 인젝션 공격으로 인해 DB에 <script *></script> 가 삽입 되어 애를 먹은적이 있었다.

다행히 스크립트를 찾아서 지워주는 쿼릴 실행해서 복구는 되었으나 지속적으로 들어와 서비스를 중단하고 소스를 수정해야하는 사항까지 갈것 같았다.
그래서 생각한게 보안처리 될 동안 복구해주는 쿼리가 주기적으로 돌아가 주면 좋겠다는 생각에 MSSQL 에이전트 작업을 이용해보았다.

백업등을 목적으로 주로 이용하지만 이렇게 원하는 쿼리를 주기적으로 동작하게끔도 할수 있다.

1. 먼저 "엔터프라이즈 관리자"를 실행한다.

사용자 삽입 이미지

2. 다음으로 콘솔루트 > Microsoft SQL Servers > (LOCAL) ... > 관리 > 작업 을 선택한다.

사용자 삽입 이미지

3. 마우스 우측 버튼을 눌러 작업 추가를 선택한다.
여기서 이름을 구분할 수 있게 적어두고 범주는 적당히 데이터베이스 유지 관리 등 선택한다.
그리고, 당연 쿼리를 실행할 소유자를 선택한다. 쿼리 적용할 소유자 필요하면 다른 작업자를 위해 설명을 달아두는것도 좋을듯..그리고 우측 대상 서버 선택 보통 [local]

사용자 삽입 이미지


4. 다음으로 단계 탭을 클릭한다. 여기서 새로 만들기 클릭

사용자 삽입 이미지


5. 단계이름 적당히 입력하고 유형은 Transact-SQL 스크립트 [TSQL] 를 선택 그리고 데이터베이스를 선택한다. 그리고 명령칸에 쿼리를 작성한다.

사용자 삽입 이미지


6. 이제 일정 탭을 선택후 새일정을 추가한다. 스크립트를 언제 마다 돌릴지 설정 해주는것이다.

사용자 삽입 이미지

7. 이름을 적당히 넣어주고 되풀이를 선택한다. 그리고 되풀이 옆에 변경을 클릭!

사용자 삽입 이미지


8. 되풀이 방법은 매일 혹은 매주 선택하고 매일 인 경우 몇일마다 1일마다면 매일이 되는것이겠죠. 하루빈도 한번수행할지 되풀이 수행할지 선택 되풀이 수행 체크하고 1분으로 설정하면 1분마다 계속 줄기차게 실행이 되겠죠 그리고 시작 끝은 그냥 놔두시면된 기본설정이 24시간이니깐.

사용자 삽입 이미지

9. 마지막으로 알림 탭에서 처리후 관리자에게 처리 상태를 메일을 발송할지 여부를 선택할 수 있다. 즉, 실패할 경우라고 선택하고 메일을 적어두면 메일을 보고서 쿼리가 동작 안하는구나 하고 판단을 할 수 있겠죠. 필요하시면 설정하시면됩니다.

사용자 삽입 이미지

10. 이것으로 설정이 끝났으며 목록에서 자신이 추가한 항목에 마우스 우측 버튼 눌러 시작을 클릭하시면 동작합니다. 만약 중지하고 싶으시면 중지 그리고 아예 비활성화 시킬수도 있습니다. 말그대로 "비활성화"를 선택해주시면 절대 동작 안합니다.

사용자 삽입 이미지

원래 백업 관리 계획용으로 주로 이용되나 저처럼 반복적인 쿼리 실행을 하고자 할 때 유용하게 사용하실 수 있을겁니다. 응용해서 잘 이용해보세요!

위 글은 제가 직접 작성한 글이니 가져가실땐 꼭 출처까지 표시 해주세요!
출처 : 세이박스 http://www.saybox.co.kr/460

PHP와 MYSQL 데이타 연결과 쿼리 주기

웹프로그램
 
PHP를 이용한 MYSQL 데이타 연결과 쿼리 주기
 * MYSQL과 ORACLE 는 별도 접속함수를 이용
 *  PHP ; server side script-x 서버에서 처리후 크라이언트
              결과 전송
 * 에디터, vi 편집기로 작성후  ***.php (ex, bbs.php)
    서버에 업로드후 실행.
* PHP는 HTML과 병행하여 작성할수 있다.
-----------------------------------------------------------------------------------------
<br>한줄 뛰기
<?php   //php시작
 $name="hban" ;
 echo "일반텍스트문 ";
 echo "<font size=3 color=red>HTML 문  $name </font> ";
 echo "<img src=이미지경로>";
 echo "<table>.....";
?> 
************************************************************************
 MySQL함수 (PHP와 MYSQL연결)
 mysql_connect ("host명","유저명","비밀번호")
* Mysql에 연결한다.
 ex) <?php
 $db=mysql_connect("localhost","korea","0000") or
 die ("접속실패");
 echo "MYSQL에 접속되었습니다.";
 mysql_close($db);
//오라클의 경우(Oracle 사용시 8i, 9i 인지 ID/Pass)
OCILOGON ("localhost","korea","0000") 의 형태이다.
 ?>
*mysql_pconnect :  영구히 데이터베이스접속
   --> 접속이 많은 DB에 효율적이다.
<?php
 $db=mysql_pconnect("localhost","korea","0000") or
 die ("접속실패");
if ($db) {
echo "데이터베이스 접속이 되속되고 있습니다. ";
}
?>
******************************************************************
MYSQL 데이터베이스 선택하기
mysql_select_db ("DB명");
ex)mysql_select_db ("korea");
MYSQL 쿼리(질의)문 전달하기
mysql_query ( "질의문");
ex) mysql_query ("select * from zip ");
*******************************************************************
MYSQL 데이터베이스를 생성
  mysql_create_db()
ex) mysql_create_db ("my_db")
MYSQL 데이터베이스 삭제
  mysql_drop_db()
ex) mysql_drop_db ("my_db")
*********************************************************************
MYSQL질의 결과로 부터 열의 개수를 반환
 mysql_num_rows ( )
ex) <?php
 $db=mysql_connect ("localhost","korea","0000");
 $query="select * from zipcode";
 $result =mysql_db_query("zip", $query, $db);
 $num=mysql_num_fields($result);
 echo "총 $num 개의 컴럼이 있습니다.";
 -----------------------------------------------------------------------
 $db=mysql_connect ("localhost","korea","0000");
 mysql_select_db("zip",$db);
$result=mysql_query("select * from zipcode", $db);
$total_num=mysql_num_rows($result);
echo "총 $total_num 이 검색 결과로 되었습니다.";
?>
-------------------------------------------------------------------------
결과를 필드 이름 혹은 숫자색인으로 배열 반환
 mysql_fetch_array( )
 ex) mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
      $result=mysql_query("select sido,gugun, dong from zip where
       ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
$si="$row[sido]";
역삼동이며  
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
<tr><td> $row[sido]</td>
<td>  $row[gugun] </td>
<td> $row[dong] </td>
</tr></table>
 <br>";
}
    echo " $row[0]  $row[1]  $row[2]";
************************************************************************
MYSQL 작업의 결과로 처리된 행(row)의 개수를 얻는다.
mysql_affected_rows ( )
--> insert, update, delete 질의로 처리된행의 갯수
--> where 절이 있어야 된다.
 ex) $db=mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip,$db");
       $result=mysql_query("delete * from zip where ......", $db);
      $total_num=mysql_affected_rows($result);
     echo "총 $total_num 개의 데이터가 삭제되었습니다.";
   ?>
  만약,where 절이 없다면 mysql_num_rows 를 사용
  
}
   mysql_free_result ($result);
  ?>
 
 
 
 
 
--------------------------------------------------------------------------------
 
 
 
 
 
* 문자열 함수 *
 MYSQL DB 에서 쿼리로 자료를 추출하다.=> $변수
 echo "<html><body><font size=2>Hellow</font>";
 echo "<font size=2> $name </font>";
   홍길동   2004-10-7    전자/유아/도서/      경리-회계-인사
 (1) addslashe($변수)  슬래쉬 문자를 인용한다.
      디비 쿼리와 같이 인용된 부분에 백슬러쉬 붙여 반환
       예) ' , " , \ , NULL
      <?php
      $st="select * from member where id='test'";
      echo addslashes($st);  ==> .... id=\'test\'
      ?>
      stripslashes ($변수)
      백슬러쉬가 있는것을 제거하여 반환한다.
      $ss="/'test/'";
      echo stripslashes($ss);
*************************************************
echo 출력한다.
 = 변수를 포함하여 출력할수 있다.
  
 ex)<?php
      echo "<font size=2>Hellow
       World
       $num 와 $bbs 입니다.</font>";   ?>
  ----------------------------------------------------------
 <html>
 <body>
 <form><input  type="hidden" name="cooki"  vale="123 12">
 <font size="2" color="red">Hellow
       World  <?php echo "$num"; ?> 와
      <?php echo "$bbs"; ?> 입니다.</font>
  ----------------------------------------------------------------
 (2) explode  (매우중요)
       문자열을 주어진 문자열을 기준으로 분리한다.
       문자열을 separator 경계로 나누어 반환
      $pizza = "piece1-piece2-piece3";
      $pieces = explode ("-",$pizza);
      echo $pieces[1];
     예) 새로운 화일 class.conf 를 만들자
           여기에 도서분류카데고리를 만든다.
           $book_class="교양/여성/유아/과학/원서/컴퓨터/건축';
          위의 explode 가 작동할 php 문을 편집한다.
     예) 옵션컬럼 $option='빨강-노랑-은색-검정";
                           $size="200cm/350cm/750cm";    
        
    require "class.conf";   
     ==> 변수, 함수, 페이지를 호출할수 있다.   
     global $book_class, $member, $welcome;
     ==> GLOBAL은 전역변수 선언으로 페이지 루틴 모두 적용
     $book_category = explode ("/",$book_class);
   
      echo "<font> 도서분류 : $book_category[0]<br>";
      echo "<font> 도서분류 : $book_category[1]<br>";   
      echo "<font> 도서분류 : $book_category[2]<br>";
      echo "<font> 도서분류 : $book_category[5]<br>";
      echo "<font size=5 color=red>
      $member 님 안녕하세요 $welcom</font>";
  ***********************************************************
    implode ()
    배열의 내용을 하나로 묶는다.
    (explode와 반대 개념, join과 기능 동일)
   ex) $book = array("과학","여성","컴퓨터");
          $class = implode (" ", $book);
         echo $class;
  ***********************************************************
   nl2br
   뉴라인을 HTML 라인 브레이크(BR)로 변환
  <?php             <br>
  $st = "hellow \n Wlecome to\n PHP world";
  echo nl2br($st);
  /*  PHP주석   */  <!--  HTML주석 -->
  echo "<html><body><!-- 회원비밀정보출력 -->";
  ?>
 ****************************************************************
  strlen ($변수) 문자열의 길이를 반환
  $st = "hellow Linux Mysql";
  echo strlen($st);
  문자열의 길이를 알수 있다.
 
  strstr ($변수, '기준자') => 기준자부터 문자열 반환
  ex) $email = 'korea@samsung.com';
      
         $domain = strstr ($email, '@');
         echo "현재 회원님의 도메인은 $domain 입니다.";
 strrev ($변수)  => 문자열을 역순으로 반환
   $url = 'www.oi.co.kr';
   echo stttev($url);
 
 str_repeat  ("반복할문자", 반복수)
  <?php
    echo str_repeat("--", 20);
   ?>
 substr ("값", 수1, 수2 );
 주어진 문자의 일부분을 반환
 echo substr("abcdef", 1)   ==> bcdef
 echo substr("abcdef", 1,3)   ==> bcd
 echo substr("abcdef", -1)   ==> f
 echo substr("abcdef", -2)   ==> ef
 echo substr("abcdef", -3,1)   ==> d
 ..("나의이상형은전지현입니다",  6,3)  => 전지현
***************************************************
   mysql table 상품 테이블을 등록한다.
   상품코드           
   상품명  CHAR   전지현                             소나타3   
   가격  INT            1000                               2000000
   제조사  CHAR    한국                                 현대
   옵션 CHAR         /미팅/친구/애인/부인       오토/수동/CDP
   마일리지 INT      0                                       2000
   설명 TEXT           국내 최고 여인                2004년 최신형
 ****************************************************
  table에 레코드를 기록
 ******************************************************
  sangpum.php
mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
 $result=mysql_query("select sido,gugun, dong from zip ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
  <tr><td> $row[sido]</td>
  <td>  $row[gugun] </td>
  <td> $row[dong] </td>
  </tr></table>
  <br>";
}
  * HTML <select name=option>
    <option value=nn>nnn</option>  형태이다.
    /친구/부인/애인..옵션을 나누어 아래 스크롤로 만든다.
   if($row["option"]) {
       echo "<select name=option>";
       $sizes = expolde("/",$row["option"]);
       $tot = sizeof($sizes);
       for($i=0;$i<$tot;$i++)
       {
        echo "<option value='$sizes[$i]'>$sizes[$i]</option>";
        }
         echo "</select>";
         }
***********************************************************
*** 이메일 보내기 ****************************************** 
$titles="$title";    
$subject="$title";  //제목
$mail_txt="$name님 안녕하세요 $id 입니다.....";
$admin_mail="nnn@nnn.com";  //보내는이메일주소
$mailto = $mail;
$mailheaders = "Return-Path: $admin_mail\r\n";
$mailheaders = "From: $title<$admin_mail>\r\n";
$mailheaders .= "Content-Type: text/html;charset=euc-kr\r\n";
//mail("보내는사람","제목","본문","메일헤더");
 mail("$admin_mail", "$titles",
            "$mail_txt", "$mailheaders");
 echo " 성공적으로 메일이 발송되었습니다. 감사합니다.";
 echo "<img src= rrrr.gif >";
 
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
***************************************************
   mysql table 상품 테이블을 등록한다.
   상품코드           
   상품명  CHAR   전지현                             소나타3   
   가격  INT            1000                               2000000
   제조사  CHAR    한국                                 현대
   옵션 CHAR         /미팅/친구/애인/부인       오토/수동/CDP
   마일리지 INT      0                                       2000
   설명 TEXT           국내 최고 여인                2004년 최신형
 ****************************************************
  table에 레코드를 기록
 ******************************************************
  sangpum.php
mysql_connect ("localhost","korea","0000");
       mysql_select_db("zip");
 $result=mysql_query("select sido,gugun, dong from zip ");
      $gesu=mysql_num_rows($result);
  echo "총 검색된 수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "<table width=600 border=1  bgcolor=#fofofo>
  <tr><td> $row[sido]</td>
  <td>  $row[gugun] </td>
  <td> $row[dong] </td>
  </tr></table>
  <br>";
}
  * HTML <select name=option>
    <option value=nn>nnn</option>  형태이다.
    /친구/부인/애인..옵션을 나누어 아래 스크롤로 만든다.
   if($row["option"]) {
       echo "<select name=option>";
       $sizes = expolde("/",$row["option"]);
       $tot = sizeof($sizes);
       for($i=0;$i<$tot;$i++)
       {
        echo "<option value='$sizes[$i]'>$sizes[$i]</option>";
        }
         echo "</select>";
         }
***********************************************************
*** 이메일 보내기 mail.php ******************************************    
global $subject, $email,$color,$message;
$subject="$subject";  //제목
$mail_txt="$message";
$admin_mail="email";  //보내는이메일주소
//$mailto = $mail;
$mailheaders = "Return-Path: $admin_mail\r\n";
$mailheaders = "From: $title<$admin_mail>\r\n";
$mailheaders .= "Content-Type: text/html;charset=euc-kr\r\n";
//mail("보내는사람","제목","본문","메일헤더");
 mail("$admin_mail", "$subject",
            "$mail_txt", "$mailheaders");
 echo " 발송된 메일의 확인입니다..";
 echo "제목: $subject <br>이메일 $email <br> $color,$message";
echo "<img src= rrrr.gif >";

***************************************************
<html><body>
<form action=mail.php method=post>
<input type=text name=subject size=30><br>
<input type=text name=email size=30><br>
<input type=text name=color size=30><br>
<textarea  rows=10  cols=30  name=message></textarea>
 <input type=submit name="[[[[ 확   인 ]]]">
 
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
PHP 의 제어 구조
(1) if-else 구문 (가장 많이 쓰이는 구문)
    ex) if (조건) { 조건에 따른 처리; }
          if ( $point > 90 ) { echo " 잘했습니다."; }
   ex) if (조건) { 조건에 다른 처리; }
         elseif (조건) { 조건에 따른 처리; }
         else { 조건에 따른 처리; }
     <?php
     $oracle=85;
     $linux=75;
     $jumsu = ($oracle+$linux)/2;
     if ($jumsu >= 90)  {
        echo "<table>...전지현";
     }
     elseif ($jumsu >=80 && $jumsu <90 )
      {
       echo "<img src=essay.gif>";
      }
     else {  echo "book3.gif";  }   ?>
 **********************************************
  while (조건)  { ~~동안 조건에 따른 처리 }
    ( = while (조건): 조건에 따른처리; endwhile; )
  <?php
  $a=1;
  while ($a <=10) {
  echo "<font size=5 color=red>$a</font><br>";
  $a++;   (1씩 증가하여 반환한다)
  }
 ***************************************************
  do while 구문
  do {  조건에 따른 처리 }
  while (조건);
 ****************************************************
 for (초기값; 끝나는조건; 반복처리)
  { 조건에 따른 처리 }
 echo "<table width=500 border=1>";
 for ($a=1; $a <=10; $a++)
        { echo "
     <tr><td bgcolor=yellow>
     <font size=3 color=red> $a 번 자료 입니다. </font>
     </td></tr>";
  }
 echo "</table>";
**********************************************************
 foreach (배열변수 as 로컬변수) { 처리구문 }
   ex) <?php
    $odd_num = array (1,3,5,7,9);
    foreach ($odd_num as $value) {
    echo "$value 입니다.<br>";
    } ?>
**********************************************************
 break, continue 구문
 break ==> for, while, switch 에서 해당 구문 빠져 나감
 continue ==> for, while 에서 현재 루프의 처음으로 돌아감
 <?php
 for ($a=1; $a<=10; $a++) {
 $value=$a;
 if ($value >30) { echo "$value";  
      break;
 }
***********************************************************
   require (파일명) - 지정파일의 함수,변수사용 (config..)
   include(파일명) - 지정파일의 읽기 실행
************************************************************
 함수(function) :
 특정 기능을 모아서 필요할때마다 불러서 사용
 중복된 기능을 피하고 동일 기능을 여러번 수행시 필요
****함수 설정하는법 ***********
 function  함수명($변수) {
  수행할 구문 
  return;   }
*****함수를 호출하여 이용하는 방법********
 함수명($변수);
*************************************************************
ex) <?php
 functin test($value) {
 echo "$value";
  return; }        test(1234); ?>
 
 function  squre($num) {
 return; }
 echo square(10); 
 function 
*********************************************
함수를 이용하여 구구단을 2단부터 9단까지 출력하는
프로그램을 만들어 보자.
(각 단 하나의 테이블로 출력하게하자)
.
*************************************************
<?php
echo "[구구단 출력 프로그램]<br>";
// 2부터 9까지 함수를 반복 호출
for ($i=2; $i<=9; $i++)
{
 show_gugudan($i);
}
 
// 숫자를 넘겨받아서 구구단을 출력
function show_gugudan($num)
{
echo "<table border=1 width=120>\n";
echo "<tr><th>$num 단</th></tr>\n";
 
for ($i=1; $i<=9; $i++)
{
echo "<tr><td align=center>$num X $i = ";
echo $num * $i;
echo "</td></tr>\n";
}
return;
}
?>
*******************************************************
변수의 사용 범위
전역변수(Global) 프로그램전체에서 사용 가능
  global $변수,$변수;
지역변수(Local) 선언된 지역(함수)에서만 사용 가능
정적 변수(static) 함수가 종료되어도 유지 사용 가능
$변수=숫자;
    -> 숫자등 정수인경우 " " 불필요
$변수="문자열";  
   -> 문자열 또한 변수 입력 $nnn등 문자열 인경우 ' " 로 처리한다.
**********************************************************
<?php
$message="구매를 합니다.";
golbal $message,$nnnn,$kkkk;

function test() {
global $message;
echo "귀하의 전달 사항은 $message 입니다.";
}
test();
?>
***********************************************************
1. FROM 변수
 폼값 ---> 서버 --->  크라이언트
 <HTML>의 형태로 만들어져 서버에 전달된다.
 FORM은 프로그램언어의 처음과 끝이다.==>폼생폼사
<HTML>
<form action="웹경로" method="get 혹은 post">
웹경로 : form value(폼값)을 받는 cgi,php,jsp경로
method
(1) get : 브라우져상단에 폼값 인수가 전달
   ex) action=mail.php
     전달방법 :..mail.php?id=korea&code=333&name=ho
 (2) post : 데이터가 표준입력 방식으로 전달
                  외부에 보이지 않는다.
-----------------------------------------------------------------
DATA를 보내는 방법---> server
한줄로 입력칸이 출력
<input type="text" name="korea" size="10"
  maxlenght="20">
name=korea 서버에 전달시 변수명(name)
size= 입력칸의 크기
maxlenght = 입력칸의 최대입력수제한
----------------------------------------------------------------
<input type=password name=ppp...>
비밀번호 입력으로 입력값이 보이지 않는다.->******
<input type=hidden name=cooki value=04010>
<input type=hidden name=id value=골뱅이>
출력되지 않지만 전달될 폼의 값
-----------------------------------------------------------------
<input type=checkbox name=취미 value=독서  checked>
<input type=checkbox name=취미 value=운전>
=>여러개의중에 다수 선택 가능
<input type=radio name=성별 value=남자>
=>한개만 선택
</form>
******************************************************
<select name=option>
<option value=노랑 checked>노랑색 우산</option>
<option value=빨강>빨강색 중간 우산</option>
<option value=파랑>파랑색 큰 우산</option>
</select>
********************************************************
내용이 긴 문장을 쓰는 입력칸
<textarea name=변수명 rows=행의길이   cols=열의길이
  wrap=virtual or physical or off>
</textarea>
wrap=virtual  화면에 맞게 자동 줄바꿈, 전송시는 입력대로 전송
wrap=physical 화면에 자동 줄바꿈 및 전송시에도 줄바꿈
wrap=off 기본적으로 자동 줄바꿈 하지 않는다.
 
*********************************************************
입력한 내용을 전달하는 버튼을 만들기
*이 버튼 위에 </form>이 있으면 전달 불능
<input type=submit  name=보내기 value="[[[[보내기]]]]">
</form>
**********************************************************
 
 
 
-----------------------------------------------------------------------------
 
 
 
 
 
php.ini -> register_global=On -> apachectl restart
 (웹상에서 POST,GET 받게함)  

 <?php
   echo "$name";
모든 전송 변수를 반는것을 선언
      extract($_GET); extract($_POST);
      echo "$name<br>";
      echo "$id"
    
전송된 변수를 받을수 있도록 설정(개별)
       echo "$_GET[name]";
       echo "$_POST[name]";
******************************************************************
MYSQL에 데이타 입력하기
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$query= "insert into goods(id,name,number)
             values(''id,'$name','$number")";
mysql_query($query);
****************************************************
데이타 출력하기
member.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$result=mysql_query("select id,name, address from zip ");
$gesu=mysql_num_rows($result);
echo "총 검색된 회원수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "
<form action=mem_modify.php method=get>
<table width=600 border=1  bgcolor=#fofofo>
<input type=hidden name=act value=modify>
  <tr><td>아이디: <input type=text name=id value='$row[id]'></td>
  <td> <input type=text name=id value='row[name]'> </td>
  <td> $row[address] </td>
********************************************************
   checkbox  나 select 박스의 처리는
if ($habby == 도박) {  $check1="checked"; $check2=""; }
elseif ($habby == 독서 ) {$check1=""; $check2="checked";}
echo "<input type=checkbox name=도박 $check1>
           <input type=checkbox name=독서  $check2>";}
수정된 정보는 업데이트 쿼리를 이용한다.
mysql_query("update member  set  id='newid',address='주소' 
             where  name='홍길동';
************************************************************
<input type=submit name=kkk value="확실히보냅니다.">
  </tr></table>
  <br>";   }
*************************************************************
*******************************************************************
폼값을 넘기는 버튼에 대해
-- 확인버튼
(이미지버튼)
<input type=image src=aaa.gif></form>
(기본 버튼)
<input type=submit  value="[[[ 확인 ]]]" name=aaa >
-- 뒤로 가는 버튼
 <a href=JavaScript-x:clickOn=history.go(-1)><img src=back.gif></a>
--웹 링크 설정
 <a href=경로>버튼</a>
--메타 리다이렉션 자동 이동하기
<meta http-equiv='Refresh' content='0; URL=index.php'>
 
 
 
-----------------------------------------------------------------------------------
 
 
 
 
 
php.ini -> register_global=On -> apachectl restart
 (웹상에서 POST,GET 받게함)  

 <?php
   echo "$name";
모든 전송 변수를 반는것을 선언
      extract($_GET); extract($_POST);
      echo "$name<br>";
      echo "$id"
    
전송된 변수를 받을수 있도록 설정(개별)
       echo "$_GET[name]";
       echo "$_POST[name]";
******************************************************************
MYSQL에 데이타 입력하기
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$query= "insert into goods(id,name,number)
             values(''id,'$name','$number")";
mysql_query($query);
****************************************************
데이타 출력하기
member.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
$result=mysql_query("select id,name, address from zip ");
$gesu=mysql_num_rows($result);
echo "총 검색된 회원수는 $gesu 입니다.";
while ($row=mysql_fetch_array($result))
  {
    echo "
<form action=mem_modify.php method=get>
<table width=600 border=1  bgcolor=#fofofo>
<input type=hidden name=act value=modify>
  <tr><td>아이디: <input type=text name=id value='$row[id]'></td>
  <td> <input type=text name=id value='row[name]'> </td>
  <td> $row[address] </td>
********************************************************
   checkbox  나 select 박스의 처리는
if ($habby == 도박) {  $check1="checked"; $check2=""; }
elseif ($habby == 독서 ) {$check1=""; $check2="checked";}
echo "<input type=checkbox name=도박 $check1>
           <input type=checkbox name=독서  $check2>";}
수정된 정보는 업데이트 쿼리를 이용한다.
mysql_query("update member  set  id='newid',address='주소' 
             where  name='홍길동';
************************************************************
<input type=submit name=kkk value="확실히보냅니다.">
  </tr></table>
  <br>";   }
*************************************************************
*******************************************************************
폼값을 넘기는 버튼에 대해
-- 확인버튼
(이미지버튼)
<input type=image src=aaa.gif></form>
(기본 버튼)
<input type=submit  value="[[[ 확인 ]]]" name=aaa >
-- 뒤로 가는 버튼
 <a href=JavaScript-x:clickOn=history.go(-1)><img src=back.gif></a>
--웹 링크 설정
 <a href=경로>버튼</a>
--메타 리다이렉션 자동 이동하기
<meta http-equiv='Refresh' content='0; URL=index.php'>
**************************************************
  04.10.12
  PHP 파일 조작 함수 및 FILE UPLOAD 처리
  (FORM 을 이용한 mysql 연동 처리)
  PHP를 이용한 방명록 만들기
(1)파일 함수
   fopen("경로명","속성")
   : 파일이나 URL를 연다.
   r :읽기전용 r+ :읽기쓰기 
   w: 쓰기전용(없으면새파일생성)
   W+ : 읽기쓰기가능(없으면새파일생성)
   a : 쓰기전용 (파일포인터맨끝,없으면 만듬), a+
-----------------------------------------
  <?php
  fopen("http://www.naver.com/","r");
  fopen("/home/text.txt", "w+");
  ?>
------------------------------------------
 <?php
  $file=fopen("http://www.yahoo.co.kr/","r");
  if (!$file) {
   echo "존재하지 않는 파일이거나 경로입니다.";
   exit;
  }
  while (!feof($file))
  {  $line = fgets($file,1024);
     echo $line;
   
   }
 fclose($file)  ?>
 
 fclose ($열린파일) :열려있는 파일 포인터를 닫는다.
 fgets (파일명,길이) :파일로 부터 하나의 줄 읽어옴
   ex) $buffer=fgets($file,4096);
        echo $buffer;
       --> $file의 파일에서 4096바이트씩 출력
 fgetc() : 파일로 부터 하나의 문자를 읽어 온다.
 ex) $fp = fopen("user.txt","r");
      while ($chr = fgetc($fp))
      {   echo $chr;  }
      fclose($fp);   
 ------------------------------------------
  fputs(파일명,길이); 파일포인터에 문자열 저장
  file () 파일 전체를 읽어서 배열로 반환
ex)
<?php
$fcontent=file('http://www.naver.com/');
    //배열로 웹 페이지를 가져오고 저장
while (list($line_num,$line)=each($fcontents))
   //each는 각각배열을 가져오고 list는배열변수로 할당
{
 echo "줄수: $line_num"
        .htmlspecialchars($line). "</br>"; }
?>  //특수문자를HTML로전환htmlspecialchars()
********************************************
 file_exists 파일이 있는지 확인
 if (file_exists("img1001.jpg"))
 { echo "<font size=3>화일이 존재합니다. 크기는</font>"
    .filesize("img1001.jpg");
    }
-------------------------------------------
 filesize () 파일의 사이즈를 구한다.
  $size=filesize($img);
   if ($size > 10000 ) { echo "용량초과화일";}
********************************************
  chmod ("php.htm", 0755);
  화일의 권한을 변경한다.
   <?php chmod("php.htm",0755); ?>
  copy(화일명,경로) :  파일을 복사한다.
  <?php copy("php.htm","/home/img/");
    echo "파일복사가 성공적으로 완료되었습니다."; ?>
  unlink(파일명); 파일을 삭제한다.
  <?php
   $file="php.htm";
   if (file_exists($file)) {
   if (unlink($file))
    {  echo "$file 이 삭제되었습니다."; }
   else { echo "파일 삭제하지 못했습니다."; }
   }
   else { echo "$file 이 존재하지 않습니다."; }
   ?>  
  exec(chmod 707 ./picture) ;
-------------------------------------------
  mkdir 경로를 만든다.
  mkdir("/tmp/dir", 0700)
  rmdir 경로를 삭제한다.
  rename(oldname, newname)
         파일 이름을 변경한다.
*******************************************
 기타함수
 mail 함수
 ex) mail("info@naver.com", "제목입니다.",
      "본문내용입니다.", "$header");
     
     *MAIL헤더는 상단에 정의하여 준다.
  $header .="X-mailer:l/n";
  $header .="content-type:text/html...";
-----------------------------------------
  sleep 지정한 시간만큼 실행을 지연
  <?php
   echo "5초후 실행됩니다.";
   flush();  //버퍼를 비운다
   sleep(5);
   echo "모든 처리가 완료되어습니다";
   ?>
  system() 명령어 실행및 출력
   <?php echo system('ls');
     exec('chmod 707 php.htm'); ?>
   * 보안상 문제가 유발될수 있다.
*****************************************
  * 문자열 암호화하기 (%와 16진수 코드,공백은 +)
    (웹에서 노출을 피하려는 문자에 이용
     ex) GET 방식 혹은 정보등)
 
   urlencode($문자변수) : 문자열이 알파벳이아닌
     문자를 인코딩(encoding)한다.
   <?php
   $myurl = "id=korea&name=홍길동";
   echo urlencode($myurl);
   echo urldecode($myurl);
   $origin='urldecode($myurl)';
    echo "<font size=5>현재 번역된 값은 $origin 입니다.";
   ?> 
  
  urldecode($문자변수) : 인코딩값을 원래문자로 변환
*************************************************************
   parse_url :
   URL를 파싱해서 각 항목을 연상 배열로 반환
   sheme, host, port,user,pass,path,query
   <?php
   $url=
parse_url(
'http://dnshop.net/gg/Category?CID=D5191');
//위의 줄은 한줄로 입력한다.
  echo "scheme : $url[scheme]<br>";
  echo "host : $url[host]<br>";
  echo "path : $url[path]<br>";
  echo "query : $url[query]<br>";
?>
***************************************************************
 
 
---------------------------------------------------------------------------------
 
 
 
 
 
*gb_write.php  ->쓴글의 변수를 받아서 DB연동및 처리
<?php
extract($_GET); extract($_POST);
//함수정의
function popup_msg($msg) {
 echo("<script-x language=\"javascript-x\">
                    <!--
                            alert('$msg');
                               history.back();
                                  //-->
                          </script-x>");
}  //함수정의끝
if (!$gb_name) { echo popup_msg('이름를 기입하세요'); }
if (!$gb_email) { echo popup_msg('e-mail 기입하세요'); }
//////////////////////////////////데이터베이스접속함수
mysql_connect ("localhost","korea","0000");
mysql_select_db("zip");
mysql_query("insert into guestbook
(gb_date,gb_ip,gb_name,gb_email,gb_location,bg_url, gb_note)
value( sysdate(),'$REMOTE_ADDR','$gb_name','$bg_location',
         '$gb_url','$gb_note')";
/////////////////////////////////////////////////////////
//// 등록후 결과 알려주기
echo "<table width=500><tr><td>
        <font size=5>등록이 완료되었습니다. 당신의 IP는 $REMOTE_ADDR</font>
        </td></tr>
         <tr><td><a href=gb_list.php>
        <font size=5>[목록 리스트] 돌아가기</font></a>
        </td></tr>
       </table>";
echo "<meta http-equiv='Refresh' content='0; URL=gb_list.php'>";
     ?>
*********************************************************************************
gb_list.php
mysql_connect ("localhost","korea","0000");
mysql_select_db("guestbook");
$result=mysql_query("select * from guestbook");
$gesu=mysql_num_rows($result);
echo "총 검색된 방문록는 $gesu 입니다.<br>";
while ($row=mysql_fetch_array($result))
  {
echo "<table width=600 border=1 bgcolor=yellow>
<tr><td>이름</td><td> $row[gb_name] 이메일; $row[gb_email] </td></tr>
<tr><td>날짜</td><td> $row[gb_date] $row[gb_ip] </td></tr>
<tr><td>주소</td><td> $row[gb_location] </td></tr>
<tr><td>홈페이지</td><td> $row[gb_url]
<a href=delete.php?idx=gb_index> [삭제] </a> </td></tr>
<tr><td>한마디</td><td> $row[gb_note] </td></tr>
</table>  ";
}
echo "<a href=gb_write_form.php>[글쓰기]</a> | [삭제] | [목록] ";
?>
**************************************************************************
delete.php
global $idx;
echo "<center><table width=600 bgcolor=fofofo>
      <tr><td align=center>
      <form action=delete_process.php method=post>
      <input type=hidden name=idx value=$idx>
      관리자 ID  <input type=text name=admin_id><br>
      비밀번호  <input type=password name=admin_pass>
     </td></tr></table></center>";
****************************************************************************
delete_process.php
global $idx, $admin_id, $admin_pass;
//관리자비밀번호설정
$admin="korea';
$passwd="0000";
//비밀번호 및 아이디 비교하기
if ( $admin_id == $admin && $admin_pass == $passwd )
{ 쿼리문으로 삭제 실행 ;
echo "<meta http-equiv='Refresh' content='0; URL=gb_list.php'>";
}
else { echo "<font size=4 color=red> 관리자만 삭제할수 있습니다.!!
      </font>";
echo "<a href=JavaScript-x:clickOn=history.go(-1)>뒤로 가기</a> <br>
        <meta http-equiv='Refresh' content='2; URL=gb_list.php'>";
}
 
 
--------------------------------------------------------------------------------
 
 
 
 
 
2004.10.13
이론) PHP 시간함수, 비교연산자 알기
실습) PHP를 이용한 설문조사
******************************************************************
touch date.php
date(형식);  => 주어진 포멧의 날자 표시
 Y : 년도 1999  y  : 2자리년도 99
 A : AM or PM  a : am or pm
 d : 2자리 숫자 날짜 (01-31)
 g : 12시간(1-12) G :24 시간(0-23)
 i : 분 (00-59) 
 m : 월 (01-12)
 s 초 : 2자리 (00-59)
 T : 시스템의 타임존
 w : 요일숫자 (0 -sun~6-sat)
$yoil=date(w);
if ($yoil=0) { $yo=일;}
  회원님 입찰은  년  월  일 (요일) 시  분 초 입니다.
 오늘은  **8월 8일 8일 (금요일)
ex) echo date();
     echo date("Y : m : d");
     $date=date();
*********************************************************
getdate() 날짜/시간 정보를 연상배열 반환
<?php
$today=getdate();
second : 초  minutes : 분
hours : 시     mday :날짜
wday :요일   mon 월(숫자)
year : 년   weekday :요일(문자)
-----------------------------------------
$month=$today['mon'];
$mday=$today['mday'];
$year=$today['year'];
echo "회원님 가입일은 $month $mday $year 입니다";
-------------------------------------------
time () : UNIX의 기준시간부터 지금까지 시간을
            초단위로 반환(Jan 1 1970 00:00:00)
ex) $time=time();
      echo "현재시간 $time";
*****************************************************************
 환경변수
 : PHP는 실행시 미리 정의된 변수를 제공한다.
  버젼에 따라 다르지만 기본적인 변수가 있다.
  (apache와 PHP 환경변수)
  <?php
  phpinfo();
  ?>
  HTTP_USER_AGENT :사용자의 브라우져 정보
   ex) echo "$HTTP_USER_AGENT";
  REMOTE_ADDR : 사용자 IP
  SERVER_ADDR : 서버의 주소
  SERVER_PORT : 웹서버에 접속하는 포트번호
  SCRIPT-x_FILENAME : 현재 실행된 스크립 절대 경로
  SERVER_SOFTWARE : 서버에 설치된 웹 서버명과 모듈
********************************************************************
 예) 회원님은 현재 _________에 시간에 접속하였고
     사용하신 브라우져는 ________이고
    ______________IP에서 접속하였고, 우리 서버의 __포트
    로 접속하였습니다. 본사 서버는 ________입니다.
 
 
 
-----------------------------------------------------------------------------------
 
 
 
 
 
<?php
extract($_GET); extract($_POST);
//userfile 넘어오면서 파일명은 _name를 붙여 생성한다.
echo "$userfile_name";
copy ("$userfile","/upload/$userfile_name");
?>
---------------------------------------------------------------------------  
$file_name = substr( strrchr($userfile_name,"."),1);
$filea_name = substr( strrchr($userfilea_name,"."),1);
if ($file_name!="gif" && $file_name!="jpg" &&
   $file_name != "asf")
  { error('자기사진 확장자는 gif, jpg, asf 이어야함');}
  if ($filea_name!="gif" && $filea_name!="jpg")
 { error('앨범그림의 확장자는 gif 또는 jpg 이어야함');}
$img_file = "$id"."."."$file_name";
$simg_file = "s-"."$id"."."."$filea_name";
copy($userfile, "/upload/$img_file");
       unlink($userfile);
copy($userfilea, "/upload/$simg_file");
       unlink($userfilea);
논리연산자
----------------------------------------------------
a and b   a와 b가 모두 참
a or b   a 와 b 중 하나가 참인경우
! a   a 가 참이 아니면
a && b   a 와 b 가 모두 참
a || b  a 와 b중 하나가 참일때
ex) if ($a && $b)  {  실행 }
     => a 와 b 의 값이 모두 있다면...
      if ($a > 10 && $b < 20 )
      if ($a || $b ) {실행}
     => a 와 b 의 값이 하나라도 있다면...
      if (!$a) { }
     => a의 값이 없다면...
--------------------------------------------------
비교연산자
a == b    a 와 b 가 같다면
a != b    a와 b가 같지 않다면
a < b , a > b , a <= b, a >=b
--------------------------------------------------
if ( $ a == $price ) { 실행 }
 ==> a 의 값이 price 와 같다면
if ( $a != $price ) {실행}
 ==> a 의 값이 price 와 같지 않다면
--------------------------------------------------
<?php
$sonnim=20000;
if ( $sonnim == $bonus )
 { echo "<font size=3 color=red>손님은 보너스해당자입니다.
    </font>"; }
else { echo "아직 보너스에 해당되지 않습니다."; }
?>
<?php
echo "<table width=500 border=1>";
for ( $a=1; $a <=20; $a++ )  {
  skin1.php   skin2.php
gb_list.php
 
if ($hit >100 ) { $icon="hot.gif";
 if ( $a%2 == 0 ) { $color="fofofo";  $icon="crown.gif";}
 else { $color="white";  $icon="gift.gif"; }
echo "<tr><td  gbcolor=$color><img src=/img/$icon>  </td></tr>";
 }
echo "</table>";
?>
********************************************************
$a=12;
$b=6.7;
$tot=$a + $b;
$tot=$a - $b;
$tot=$a * $b;
$tot=$a / $b;
$tot=$a % $b;
echo "$tot";
************************************************************
ARRAY (배열)
$data = array ( "사원"=>"홍길동",
"대리"=>"박진영", "과장"=>"춘삼이",
"대표"=>"코코넛" );
while ( list($jikgub,$name) = each($date) )
{
 echo $jikgub ."님은" .$name ."입니다.<br>";
}
?>
------------------------------------------------------------------
SWITCH 구문
$price=200;
switch ($price) {
 case (100) :
echo "옥션에서 입찰은 불가능합니다. ";
 break;
 case (200) :
echo "입찰 가능한 금액입니다.";
 break;
 case (300) :
echo "금액이 높은 입찰은 매우 환영 반갑습니다.";
 break;
default;  echo "옥션에 참여하고 있습니다.";
}
____________________________________
require "error.php";
if (!$name) { error("name");  exit;}
if (!$name) { error("id");  exit;}
if (!$name) { error("password");  exit;}
PHP출력및 디비 연동 프로그램 페이지
____________________________________
<?php
function popup_msg($msg) {
   echo("<script-x language=\"javascript-x\">
   <!--
   alert('$msg');
   history.back();
   //-->
   </script-x>");
}
********************************************************
function error($errcode) {
   switch ($errcode) {
      case ("name") :
         popup_msg("이름을 입력하세요.");
         break;
      case ("id") :
         popup_msg("아이디를 입력하세요.");
         break;
      case ("password") :
         popup_msg("비번을 입력하세요");
         break;
  default ;
}
 
---------------------------------------------------------------------------------
 
 
 
 
[[[[[ 에러출력페이지 만들기 ]]]]]
____________________________________
require "error.php";
if (!$name) { error("name");  exit;}
if (!$id) { error("id");  exit;}
if (!$password) { error("password");  exit;}
*위의 $변수들은 정규 패턴을 검사하면 좋다.
PHP출력및 디비 연동 프로그램 페이지
____________________________________
error.php 의 핵심 스크립
<?php
function popup_msg($msg) {
   echo("<script-x language=\"javascript-x\">
   <!--+
   alert('$msg');
   history.back();
   //-->
   </script-x>");
}
********************************************************
function error($errcode) {
   switch ($errcode) {
      case ("name") :
         popup_msg("이름을 입력하세요.");
         break;
      case ("id") :
         popup_msg("아이디를 입력하세요.");
         break;
      case ("password") :
         popup_msg("비번을 입력하세요");
         break;
  default ;
}
<?php
//공용 라이브러리에서 설정한다. (ex, lib.php)
$dburl = "localhost";  //db URL
$dbuser = "korea";  //DB 사용자 ID
$dbpasswd = "0000";  //비밀번호
$dbname = "korea";  //DB이름
$dbconn = mysql_connect("$dburl","$dbuser","$dbpasswd");
  mysql_select_db("$dbname",$dbconn);
---------------------------------------------------------------
   book.php
ex) require "lib.php";
      global $dbconn;
       $dbresult = mysql_query
               ("select * from member where id='$id' ",$dbconn);
        $row=mysql_fetch_array($dbresult);
        각 변수로 받아옴 ex) $row[name];
       echo "$row[name]";
       $dbresult = mysql_query
               ("select * from order where oid='$oid' ",$dbconn);
        $row2=mysql_fetch_array($dbresult);
        echo "$row2[name];
------------------------------------------------------------------
전송된 폼 값을 받아 화일을 작성하는 핵심PHP 코드
lib.php를 만드는 admin_processing.php
----------------------------------------------------------
<?
global $ntitle,$url,$dbname;
//기존화일을 연다
$fp = fopen("/lib/lib.php","w");
fwrite($fp," <?php
\$title = \"$ntitle\"; //사이트 이름
.....
");
fclose($fp);
<name type="text" name="title" value="<?php echo "$title"; ?> ">
 
 $url="http://211.254.138.191/gb/gb_write_form.php";
           $title="????????????";
           $id="root";
           $passwd="rlagmlwns";
           $listwidth="600";
           $bgcolor="green";
           $listbg="gray";
           $imgwidth="400";
           $dbname="guestbook_hj";
           $dbuser="root";
           $usedb="guestbook_hj";

 echo "
<script-x language = javascript-x>
        function imgopen(){
        winstate =
window.open('large_view.php?image=$row[id]','image','width=600,height=500,resizable=yes,scrollbars=yes');
        }
</script-x>";
 <a href=javascript-x:imgopen()><img src=ala.gif border=0></a>

<\>
 

MySQL 로그 파일 관리 - mysql rotate를 이용하여 쿼리 로그 확인

데이타베이스
=======================================================
   MySQL 로그 파일 관리
=======================================================

Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.
1. 에러로그
2. 일반적인 로그
3. UPDATE 로그
첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입
니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를
실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로
저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생
성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.
이 로그 파일은 Mysql 실행시 --log 옵션을 주어 활성화 시키면 된다.
# /usr/local/mysql/bin/safe_mysqld --log &
업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성
화 되지 않고 Mysql 실행시 --log-update 옵션으로 가능하다.
# /usr/local/mysql/bin/safe_mysql --log-update &
업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시
실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다
뒤의 번호가 1씩 증가 한다. 혹은 --log-update=mysql.log 와 같이 로그파일명을
정해줄수도 있다.  Update 로그는 update 쿼리만 저장하거 같지만 ..
delete , create 등의 쿼리도 모두 저장한다.
mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에
문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.
로그 파일을 관리하는 방법으로는 두가지가 있다.
먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과
간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.
/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..
--log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.
# vi /usr/local/mysql/share/mysql/mysql-log-rotate
-------------------------------------------------------------------------
----
# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
/usr/local/mysql/var/mysqld.log {
        # create 600 mysql mysql
        notifempty
    daily
        rotate 3
        missingok
        compress
    postrotate
    # just if mysqld is really running
    if test -n "`ps acx|grep mysqld`"; then
            /usr/local/mysql/bin/mysqladmin flush-logs
    fi
    endscript-x
}
-------------------------------------------------------------------------
--
위의 파일을 /etc/logrotate.d 디렉토리에 복사만 하면 알아서 로테이트 하게 된다.
단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈디렉토리에
.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한
다.
vi /root/.my.cnf
--------------------------------------
[mysqladmin]
password = xxxxxxxxx
user = root
--------------------------------------
정상적인 로그 교체의 확인은 다음과 같이 하면 된다.
# logrotate -f /etc/logrotate.d/mysql-log-rotate

이밖에 --log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로
번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.
이는 각자 머리를 잘 짜면 될거 같다.
#!/bin/sh
find /usr/local/mysql/var -name "*.[0-9]*" -type f -mtime +3 -exec rm -f {} \;
/usr/local/mysql/bin/mysqladmin flush-logs
위와 같은 만들면 된다. 이는 "3일 지난 파일은 지워라" 로 cron 에 등록한뒤 적절한
시간마다 실행해주면 된다.

mysql 자주 사용하는 쿼리 정리

데이타베이스
# root암호설정 - root로 로그인하여 해야함
% mysqladmin -u root password '변경암호'
% mysqladmin -u root -p기존암호 password '변경암호'

root암호변경설정
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
This is done with:
/usr/bin/mysqladmin -u root -p password 'new-password'
/usr/bin/mysqladmin -u root -h ns.dbakorea.pe.kr -p password 'new-password'

DB작업
DB생성: mysql> create database DB명 ( or % mysqladmin -u root -p create DB명 )
DB삭제: mysql> drop database DB명
DB사용: mysql> use DB명 (엄밀히 말하자면, 사용할 'default database'를 선택하는 것이다.)
DB변경: mysql> alter database db명 DEFAULT CHARACTER SET charset (4.1이상에서만 available)

MySQL 연결
mysql -u 사용자 -p DB명 ( or % mysqladmin -u root -p drop DB명 )

데이터파일 실행(sql*loader기능)
mysql>load data infile "데이터파일" into table 테이블명 ;
데이터파일에서 컬럼구분은 탭문자, Null값은 /n로 입력
데이터파일의 위치는 /home/kang/load.txt 와 같이 절대경로로 지정할것.

질의 파일 실행
쉘프롬프트상에서
mysql -u 사용자 -p DB명 < 질의파일
or
mysql프롬프트상에서
mysql> source 질의파일

쉘프롬프트상에서 질의 실행
dbakorea@lion board]$ mysql mysql -u root -pxxxx -e \
> "INSERT INTO db VALUES(
> 'localhost', 'aaa', 'aaa',
> 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y')"


사용자 생성 & 사용자에게 DB할당
shell> mysql --user=root -p mysql

mysql> INSERT INTO user VALUES('localhost','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES ('localhost','DB명','사용자','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('%','DB명','사용자','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES; (or shell prompt: mysqladmin -u root -pxxxx reload)

CASE 2: GRANT명령을 이용한 사용자 생성(이 방법이 권장된다)
kang이라는 DB를 만들고, 이 DB를 아래에서 나열된 권한을 가진 kang이라는 사용자를 생성
create database kang;
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';

mysql> create database kang;
Query OK, 1 row affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@localhost identified by 'kang';
Query OK, 0 rows affected (0.00 sec)

mysql> grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on kang.* to kang@'%' identified by 'kang';
Query OK, 0 rows affected (0.01 sec)

mysql>

여러가지 명령정리
mysql> show variables; 서버의 variables(설정사항)출력
mysql> show variables like 'have_inno%' 조건에 맞는 variables만 출력
mysql> show databases; database목록
mysql> show tables; 현재DB의 테이블목록(temporary table은 출력하지 않음)
mysql> show tables from db명; 지정된 db명이 소유한 테이블목록
mysql> show tables like 'mem%'; 조건에 맞는 테이블목록만 출력
mysql> show index from 테이블명; 인덱스 보기
mysql> show columns from 테이블명; 테이블구조(describe 테이블명, explain 테이블명)
mysql> show table status; 현재 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show table status from db명; 지정된 DB의 테이블들의 상태(row수,table type,row길이,..)
mysql> show create table 테이블명; 해당 테이블 생성 SQL문 출력
mysql> rename table 테이블1 to 테이블2; 테이블명 변경(ALTER TABLE 테이블1 RENAME TO 테이블2)
mysql> rename table 테이블1 to 테이블2, 테이블3 to 테이블4; rename multiple tables
mysql> rename table db1명.테이블명 to db2명.테이블명; 테이블을 다른 DB로 이동
mysql> alter table 테이블명 add 컬럼명 데이터타입; 컬럼추가
mysql> alter table 테이블명 del 컬럼명; 컬럼제거
mysql> alter table 테이블명 modify 컬럼명 컬럼타입; 컬럼명에 지정된 컬럼타입의 변경
mysql> alter table 테이블명 change old컬럼명 new컬럼명 컬럼타입 컬럼명 변경
mysql> alter table 테이블명 type=innodb; 테이블type변경
mysql> create table 테이블명(..) type=heap min_rows=10000; 10000row를 수용할 수 있을 만큼 메모리할당(heap type이므로)
mysql> select version(); MySQL서버버전 출력
mysql> create table 테이블2 as select * from 테이블1; 테이블1과 동일한 테이블 생성(with 데이터, as는 생략가능)
mysql> create table 테이블2 as select * from 테이블1 where 1=2; 테이블1과 동일한 구조의 테이블 생성(without 데이터, 1=2는 0으로 할수도 있다.)
mysql> insert into 테이블2 select * from 테이블1; 테이블1의 데이터를 테이블2에 insert


테이블이 존재여부 파악
DROP TABLE IF EXISTS 테이블명;
CREATE TABLE 테이블명 (...);
프로그래밍 언어에서 COUNT(*)를 사용하여 질의가 성공하면 테이블이 존재함을 파악할 수 있다.
ISAM, MyISAM의 경우 COUNT(*)가 최적화되어 상관없으나, BDB, InnoDB의 경우 full scan이 발생하므로 사용하지 마라.
대신 select * from 테이블명 where 0; 을 사용하라. 질의가 성공하면 테이블이 존재하는 것이고, 아니면 존재하지 않는 것이다.



접속
mysql {-h 접속호스트} -u 사용자 -p 사용DB
-h로 다른 서버에 존재하는 MySQL접속시 다음과 같이 MySQL DB에 설정해줘야 한다.
mysql> INSERT INTO user VALUES('접근을 허용할 호스트ip','사용자',PASSWORD('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv) VALUES('접근을 허용할 호스트ip','사용DB','사용자','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES; or 쉴프롬프트상에서 % mysqladmin -u root -p flush-privileges


검색조건(where)
regular expression을 지원하다니 신기하군..
mysql> select * from work where 열명 regexp "정규표현식";


백업 & 복구
mysqldump {-h 호스트} -u 사용자 -p DB명 > 백업파일
mysql {-h 호스트} -u 사용자 -p DB명 < 백업파일

mysqldump -u root -p --opt db_dbakorea > dbakorea.sql
mysqldump -u root -p --opt db_board | mysql ---host=remote-host -C database (상이한 머쉰)
mysql -u dbakorea -p db_dbakorea < dbakorea.sql

mysqldump -u root -p --opt db_dbakorea | mysql ---host=ns.dbakorea.pe.kr -C db_dbakorea

테이블 생성구문만을 화면에서 보려면 다음과 같이 --no-data를 사용한다. 테이블명을 생략하면 모든 테이블 출력
mysqldump -u 유저명 -p --no-data db명 테이블명

테이블 검사
isamchk

오라클 sysdate와 동일
insert into test values('12', now());

유닉스 time()함수 리턴값 사용
FROM_UNIXTIME(954788684)
UNIX_TIMESTAMP("2001-04-04 :04:04:04")

MySQL 디폴트 DB&로그파일 위치
/var/lib/mysql
/var/lib디렉토리는 여러 프로세스들이 사용하는 데이터를 저장하는 일종의 파일시스템상의 데이터베이스라고 볼 수 있다.

replace
해당 레코드 존재하면 update하고, 존재하지 않는다면 insert한다.(insert문법과 동일)
replace into test values('maddog','kang myung gyu')'

explain
explain 질의문: 지정한 질의문이 어떻게 실행될 건지를 보여줌
mysql> explain select u.uid, u.name, a.name from sm_user u, sm_addr a where u.uid=a.uid;
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
| u | ALL | PRIMARY | NULL | NULL | NULL | 370 | |
| a | ref | sm_addr_uid_idx | sm_addr_uid_idx | 11 | u.uid | 11 | |
+-------+------+-----------------+-----------------+---------+-------+------+-------+
2 rows in set (0.01 sec)


temporary table
크기가 큰 테이블에 있는 subset에 대한 질의라면 subset을 temporary table에 저장한 후 질의하는 것이 더 빠를 경우가 있다.
temporary table는 세션내에서만 유효하고(현재 사용자만이 볼수 있다는 뜻), 세션종료시 자동적으로 drop된다.

create temporary table (...);
create temporary table (...) type=heap; 디스크가 아닌 메모리에 테이블 생성

존재하는 permanent table의 테이블명과 동일하게 생성할 수 있으며,
temporary table은 permanent table보다 우선시되어 처리된다.
4.0.7의 감마버전에서 테스트하면 결과는 약간 달라진다. 버그인건지..

mysql> create table test (id varchar(10));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values('dbakorea');
Query OK, 1 row affected (0.00 sec)

mysql> create temporary table test(id varchar(10));
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
Empty set (0.00 sec)

mysql> drop table test;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+----------+
| id |
+----------+
| dbakorea |
+----------+
1 row in set (0.00 sec)



Table Type에 다른 Files on Disk

ISAM .frm (definition) .ISD (data) .ISM (indexes)
MyISAM .frm (definition) .MYD (data) .MYI (indexes)
MERGE .frm (definition) .MRG (list of constituent MyISAM table names)
HEAP .frm (definition)
BDB .frm (definition) .db (data and indexes)
InnoDB .frm (definition)

보통 mysqldump를 사용하여 백업을 수행하여 다른 DB서버에 데이터를 restore하면 된다.
MySQL은 별다른 작업없이 데이터파일을 단순히 복사(copy)하는 것만으로도 다른 서버에
DB을 이동시킬 수 있다. 하지만, 이런 방식이 지원되지 않는 table type도 있다.

ISAM: machine-dependent format하기때문에..
BDB : .db파일에 이미 테이블위치가 encode되어 있기때문에..
MyISAM, InnoDB, MERGE :가능(machine-independent format)

별다른 지정을 하지 않았다면 디폴트 TABLE type이 MyISAM이므로, 무난히 migration할 수 있다.
floating-point컬럼(FLOAT,DOUBLE)이 있다면 이러한 방식이 실패할 수 도 있다.

쉘에서는 mysql이 되는데 PHP에서 mysql.sock error를 내면서 MySQL이 안되는 경우
mysql.sock은 /tmp 아니면 /var/lib/mysql에 생기게 된다.
나의 경우, /var/lib/mysql에 mysql.sock파일이 있는데 PHP에서는 /tmp에서 찾으려하면서 에러를 발생했다.
/usr/bin/safe_mysqld파일에서 다음과 같이 수정한다.
주석(#)이 달린 것이 원래것이고 그 밑에 있는것이 수정한 것이다.

# MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/var/lib/mysql/mysql.sock}
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-/tmp/mysql.sock}

위와 같이 하니 /usr/bin/mysql이 /var/lib/mysql/mysql.sock에서 소켓파일을 찾으려 했다.
socket file을 지정하는 --socket이라는 옵션으로 다음과 같이 지정하면 된다.

mysql --socket=/tmp/mysql.sock -u dbakorea -p db_test

하지만 mysql실행시마다 이렇게 써줘야한다는 것이 상당히 귀찮다. 옵션이 바로 적용되게 설정하자.
mysql은 설정사항을 다음 3가지 파일에서 검색한다.

/etc/my.cnf global options(MySQL 전체적으로 사용되는 옵션 정의)
mysql-data-dir/my.cnf 특정 DB에 적용되는 option (/var/lib/mysql/my.cnf)
~/.my.cnf 사용자 각각의 설정('~'문자는 사용자의 홈디렉토리는 의미)

/usr/share/mysql디렉토리에 예제가 있으므로 참고한다.
소켓파일의 지정은 다음줄을 넣어주면 된다.

socket = /tmp/mysql.sock


== /etc/my.cnf예 ==
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock



MySQL에서 통계처리시
orderby, groupby 는 sort_buffer를 늘여준다.(show variables)

live table(smslog)에서 모든 질의를 처리하지 말고 summary table에 질의결과를 저장해 재질의 처리한다.
summary table이 heap-type table가 가능한지 확인할 것.

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
tblTemp1.fldOrder_ID > 100;


join이 subselect보다 빠르다.
join시 사용되는 컬럼은 동일한 column type과 길이를 가져야만 최적의 속도를 보장한다.
즉, 동일 column type이지만 길이가 다르다면(char(11), char(10)), 동일한 컬럼도메인으로 변경해주는 것이 좋다.
where의 in은 optimize되어 있으므로 빠르다
insert,select는 동시에 수행가능하다.(어떻게?)
explain으로 질의과정 점검


varchar to/from char
conversion varchar를 char로 변경할 경우 모든 컬럼타입을 동시에 변경해야 한다.
반대의 경우, 하나만 char->charchar변경시 다른 모든 컬럼도 varchar로 변경됨
참.. 특이하구만..

mysql> CREATE TABLE chartbl (name VARCHAR(40), address VARCHAR(80));
Query OK, 0 rows affected (0.05 sec)

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(40) | YES | | NULL | |
| address | varchar(80) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> alter table chartbl modify name char(40);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc chartbl;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(40) | YES | | NULL | |
| address | varchar(80) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> alter table chartbl modify name char(40), modify address char(80);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc chartbl;
+---------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| name | char(40) | YES | | NULL | |
| address | char(80) | YES | | NULL | |
+---------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql>


"For each article, find the dealer(s) with the most expensive price."

표준안
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);

수정안(최적화)
CREATE TEMPORARY TABLE tmp (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL);

LOCK TABLES shop read;

INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;

SELECT shop.article, dealer, shop.price FROM shop, tmp
WHERE shop.article=tmp.article AND shop.price=tmp.price;

UNLOCK TABLES;

DROP TABLE tmp;



==============================================================================
MySQL 특성정리
==============================================================================
primary key, foreign key지원
index 지원(15개컬럼, 256byte까지)
MySQL에서의 Stored Script-x개념 => SQL server language
commit-rollback개념 => lock tables(lock table test write -> 트랜잭션.. -> unlock tables)
컬럼명길이: 64자까지, 컬럼 Alias: 256자까지
not case-sensitive: keywords, functions, column, index명
case-sensitive: database, table, alias명
키워드,함수명은 대소문자구별이 없지만, db명과 table명은 Unix계열이라면 case-sensitive하다.
(이는 오브젝트명이 OS의 fs에 따라 저장되기 때문이다. 서버의 lower_case_table_names 변수를
1로 설정하면 오브젝트명은 모두 소문자로 저장되므로 유닉스-윈도간 호환성을 높일 수 있다.

지원되지 않는 부분:
Stored Procedure(5.0이상부터 지원된다고 함)
View(5.0이상부터 지원된다고 함)
Trigger(5.0이상부터 지원된다고 함)
subquery(4.1이상부터 지원된다고 함)
union, union all(4.0이상부터 지원됨)

[테이블 type에 따른 인덱스 특성]
Index Characteristic ISAM MyISAM HEAP BDB InnoDB
NULL values allowed No Yes As of 4.0.2 Yes Yes
Columns per index 16 16 16 16 16
Indexes per table 16 32 32 31 32
Maximum index row size (bytes) 256 500 500 500/1024 500/1024
Index column prefixes allowed Yes Yes Yes Yes No
BLOB/TEXT indexes allowed No Yes(255 bytes max) No Yes (255 bytes max) No


인덱스 생성
- alter table을 이용한 인덱스 생성이 더 flexible함
- 인덱스명은 생략가능

ALTER TABLE 테이블명 ADD INDEX 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD UNIQUE 인덱스명 (인덱스컬럼);
ALTER TABLE 테이블명 ADD PRIMARY KEY (인덱스컬럼);
ALTER TABLE 테이블명 ADD FULLTEXT (인덱스컬럼);

CREATE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (인덱스컬럼);
CREATE FULLTEXT INDEX 인덱스명 ON 테이블명 (인덱스컬럼);

unique인덱스와 primary key인덱스와의 차이
unique은 null허용하지만, primary key는 null허용 안함
unique은 하나의 테이블에 여러개 올 수 있지만, primary key는 하나만 존재

테이블생성시 지정
CREATE TABLE 테이블명
(
... column declarations ...
INDEX 인덱스명 (인덱스컬럼),
UNIQUE 인덱스명 (인덱스컬럼),
PRIMARY KEY (인덱스컬럼),
FULLTEXT 인덱스명 (인덱스컬럼),
...

);


index prefix 생성
- 컬럼의 전체길이중 일부만 인덱스로 사용
- supported for ISAM, MyISAM, HEAP, and BDB tables, but not for InnoDB tables
- 지정되는 길이는 byte단위가 아닌 charater단위이므로, multi-byte character일 경우 주의
- blob, text 컬럼타입일 경우, index prefix 가 유용(255 길이까지 가능)

CREATE TABLE 테이블명
(
name CHAR(30) NOT NULL,
address CHAR(60) NOT NULL,
INDEX (name(10),address(10))
);


인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
ALTER TABLE 테이블명 DROP PRIMARY KEY;


outer join

[MySQL]
left outer joing : SELECT t1.*, t2.* FROM t1 LEFT OUTER JOIN t2 ON t1.i1 = t2.i2;
right outer joing: SELECT t1.*, t2.* FROM t1 RIGHT OUTER JOIN t2 ON t1.i1 = t2.i2;

[Oracle]
left outer joing : SELECT t1.*, t2.* FROM t1, t2 where t1.i1 = t2.i2(+);
right outer joing: SELECT t1.*, t2.* FROM t1, t2 where t1.i1(+) = t2.i2;

SELECT
student.name, student.student_id,
event.date, event.event_id, event.type
FROM
student, event
LEFT JOIN score ON student.student_id = score.student_id
AND event.event_id = score.event_id
WHERE
score.score IS NULL
ORDER BY
student.student_id, event.event_id;


:= 문장을 이용한 변수의 설정

현재 dbakorea의 데이터베이스강좌게시판에 등록된 총 게시물은 43개이다. 43개의 강좌를 읽은 수(hit수)는 각각 다르다.
평균 hit수를 구해 보자.

mysql> select @total_hit := sum(hit), @total_record := count(*) from zetyx_board_database;
+------------------------+---------------------------+
| @total_hit := sum(hit) | @total_record := count(*) |
+------------------------+---------------------------+
| 3705 | 43 |
+------------------------+---------------------------+
1 row in set (0.00 sec)

mysql> select @total_hit/@total_record as 평균HIT;
+-----------------+
| 평균HIT |
+-----------------+
| 86.162790697674 |
+-----------------+
1 row in set (0.00 sec)



select substring(subject from 9) from zetyx_board_database where substring(subject, 1, 8) = '[ORACLE]';


보통 상용DBMS들이 row-level locking을 지원한다. 쉽게 말해 레코드단위로 락킹한다는 말이다.
반면, MySQL의 MyISAM 테이블타입은 table-level locking을 사용한다.
쉽게 말하면, insert, update, delete작업은 전체 테이블에 락을 걸고 처리된다는 것이다.
row-level락보다 비효율적이지만,.. MySQL은 빠르기 때문에 이 단점이 상쇄된다.

Compressed MyISAM(packed MyISAM)
정적인 테이블데이터는 압축하여 20-60%정도의 공간을 절약할 수 있다.
Production데이터를 CD로 받아서 차후 디스크에 풀지 않고 CD자체로 바로 사용할 수도 있다.
gzip등으로 백업받으면 이를 푸는 과정이 필요할 것이다.
% myisampack dbakorea.myi

데이터베이스 게시판의 Merge Table에 좀 더 자세한 내용을 적어 두었다.


RAID Table
1개의 테이블은 OS상에 3개의 파일로 구성된다.
스키마파일(.frm), data파일(.myd), index파일(.myi)
MySQL의 RAID테이블은 데이터파일(.myd)을 여러개의 파일들로 구성하는 것이다.

create table raid_test (...)
type=myisam raid_type=striped raid_chunks=4 raid_chunsize=8

테이블을 4개의 데이터파일로 나누고, 8kb단위로(8kb stripe) 라운드로빈 방식으로 write가 이루어진다.

This article comes from dbakorea.pe.kr (Leave this line as is)

MYSQL 쿼리에 if 문 사용하기 예제

데이타베이스
Select
ADate,
Sum(Amnt) As Total,
Sum(If(Pay = 1, Amnt, 0)) As Pay1,
Sum(If(Pay = 2, Amnt, 0)) As Pay2
From ATable
Group By ADate;

MYSQL 7일 기간 텀으로 쿼리 부르기

데이타베이스
SELECT count(*) as num FROM table
WHERE UNIX_FROM(signdate, '%Y-%m-%d') <= DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 7 DAY)

MYSQL 중복 체크한 쿼리

데이타베이스

select distinct no,user_id,name,jumin,count(no) as kk from member group by jumin having kk !='1'