python을 쓰다보면 C와 연동할 일이 생기는데,
이럴 때 사용하게 되는 것이 swig입니다.
http://www.swig.org/

다음은 초간단한 c 함수를 만들어서 swig를 이용하여,
python에서 호출을 해 보도록 하겠습니다.
( 이 내용들은 swig tutorial에 있는 내용들을 좀 더 간단하게
제 환경에서 테스트해본 결과입니다. )

~/temp$ vi sample.c
int inc( int a ){
        return a+1;
}

~/temp$ vi sample.i
%module sample
%{
extern int inc(int a);
%}
extern int inc(int a);

~/temp$ swig -python sample.i
~/temp$ gcc -c sample.c sample_wrap.c -I/usr/include/python2.4
~/temp$ ld -shared sample.o sample_wrap.o -o _sample.so

~/temp$ ipython
Python 2.4.3 (#2, Oct  6 2006, 07:52:30)
Type "copyright", "credits" or "license" for more information.

IPython 0.7.1.fix1 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: import sample
In [2]: sample.inc(1)
Out[2]: 2

ㅇㅋ!

AND

Google AJAX Language API가 나왔다는 소식을 듣고,
제 블로그에도 한번 적용해 보았습니다.

각 포스트의 하단에 보면 아래 스샷과 같이 "Translate to English..."라는 버튼이 있습니다.



이 버튼을 누르면 아래 스샷과 마찬가지로 영어로 번역된 결과가 펼쳐집니다.



구현은 거의 할게 없었으며, 스킨을 약간 수정하고,
단순히 google api를 부르기면 하면 되네요.

그런데 tag가 달린 상태로 html 입력문자열을 던지거나, 자세히 세어보지는 않았지만 입력이 약 1KBytes 이상이 되면 뻗어버리더군요.
그래서 어쩔수 없이 <br>태그를 구분자로 나눠서 나머지 html tag들은 간단하게만 제거해서 입력인자로 주었습니다.
( 고로 이미지 등의 태그는 모두 날라가고 영어로 번역한 결과만 나옵니다. )

헤더의 소스는 다음과 같습니다.



마지막으로, 번역을 하기 위한 소스를 가져오기 위해서 아래와 같이 "source"와 "translation"의 위치를 지정해 줍니다.
<div id="source"></div>
<div id="translation"></div>
전 textcube를 쓰기 때문에 본문의 치환자인 를 "source"로 지정해 주었습니다.
물론 More/Less를 위한 부분이 추가적으로 있지만, 그 부분은 취향차에 따라 다르게 가져가시면 될듯 합니다.

음, 그런데 생각보다 번역 결과가 구리네요.
제가 너무 한국말을 이상하게 써서 그런지, 거의 결과가 알아볼 수 없는 수준으로 나옵니다...
구글이 쓰는 통계적 방식이라면 이런 것도 다 잘 처리해야 하는거 아닌가요 --?
약간 실망했습니다... ^^;

ps.
그리고 번역 결과를 보시려면, 블로그 main과 같이 여러 글이 포스팅되어있는 화면에서 누르면 제일 위의 글에 대한 결과만 나옵니다. 각각의 포스트로 가서 번역 버튼을 눌러야 제대로 동작합니다~
귀차니즘의 부작용이죠 ㅎㅎ...
AND

구글 코드 대학

개발 2008. 3. 24. 19:04
구글 코드 대학이랍니다.
http://code.google.com/edu/

다음과 같은 내용이 들어있습니다.
특히 요며칠 python 책을 머사볼까 했는데,
일단 python 강의를 듣고 고민해봐야할듯 :)

ps.
봐야할것들은 넘쳐흐르는데 시간이 모자르는군요... ㅡ.ㅜ

ps2.
중국어,일어는 지원되는데 한국어는 지원안되는군요...
역시 변방의 설움...
CJK~에서 K가 젤 마지막이고 시원찮을때 알아봤어야되었나...

AND

helloboy님의 블로그에 정리가 잘 되어있길래 퍼왔습니다.
전 우분투를 써서 설정과 설치가 좀 다르지만,
잘 몰랐던 htaccess rewrite module에 대해서 이제야 대충 감이 잡히네요 ^^


Apache rewrite Module


Apache 는 추가적으로 사용할 수 있는 유용한 모듈들을 제공합니다. 이번강좌에서는 Apache의 URL Rewrite 모듈을 사용하기 위한 컴파일,설치와 httpd.conf의 설정방법 그리고 활용방법에 대해 알아보겠습니다.


Apache 다운로드 : http://www.apache.org

1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션

Rewrite 모듈을 쓰기위한 Apache 컴파일 옵션은 --enable-rewrite 입니다. Configure 실행시에  --enable-rewrite 만 추가하시면 Apache에서 rewrite 모듈을 사용할 있게 됩니다.

[root@superuser root]# ./cofigure prefix=/usr/local/apache2 --enable-rewrite

[root@superuser root]# make

[root@superuser root]# make install


1. Rewrite 를 적용할 수 있는 범위

Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있습니다. Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.


2. Rewrite 모듈 지시자

RewriteEngine

설정문법 : RewriteEngine On|Off

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 당연히 Off로 되어 있으며 RewriteEngine On 으로 설정하지 않는 이상 Rewritng 엔진을 활성화 시키지 않습니다.


현재 Apache에서 실행중인 모든 RewriteRule을 비활성화 시킬 때 RewriteRule 라인을 주석처리 하기보다 RewriteEngin Off 로 설정하는 것이 더 간편하고 올바른방법입니다.


RewreteLog

설정문법 : RewriteLog FILE-PATH

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.
RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자수가 많은사이트에서는 감당못할 정도의 로그파일을 남기기 때문에 시스템 여유공간이 많이 없는 시스템에서는 해당 파티션의 하드사용률 100%로 인한 재앙(?)을 불러올수도 있습니다. 다음강좌에서 소개될 로그파일 분석에서 언급하겠지만 로그파일은 유용한 디버깅 도구가 될수 있지만 잘못 관리하면 시스템의 치명적인 악으로 존재할수도 있습니다.


RewriteLog 지시자는 반드시 RewriteLogLevel 지시자와 함께 사용하여야 됩니다.


RewriteLogLevel

설정문법 : RewriteLogLevel Level

RewriteLogLevel 지시자는 RewriteLog 지시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 은 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다. Level 숫자가 높을수록 자세한 로그를 기록합니다


RewriteCond

설정문법 : RewriteCond TestStirng CondPattern

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule은 RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행한다.


RewriteRule

설정문법 : RewriteRule Pattern Substitution

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.


Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다. 이 강좌에서는 기초적인 정규표현식 사용방법만 다루고 정규표현식에 대해 자세히 알고 싶으신 분은 정규표현식에 대한 강좌나 인터넷 문서를 참고하시기 바랍니다.


정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현


RewriteRule 플래그

forbidden|F : 요청하는 페이지를 403 에러로 redirect 시킵니다. RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금 페이지 접근을 할수 없게 할 때 사용합니다.

) RewriteRule ^/test /home/blog/html/test.php [F]

사용자가 /test 로 접근할 경우 403 에러를 보냅니다.


gone|G
: 요청하는 페이지를 410 에러로 redirect 시킵니다. 410 에러는 페이지가 사라젔거나 존재하지 않는다는 메시지입니다. 이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.


last|L
: 이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다. C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.


chain|C
: 이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.
예)

RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

RewriteRule ^([^.]+)\.domain\.com(.*) /home/$1/public_html$2

이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동설정해 줄 때 많이 쓰는 룰입니다. RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.


http://user_id.domain.com/hello.html 이란 요청이 들어오면  /home/user_id/public_html/hello.html 로 redirect 시켜줍니다. 위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.


RwriteRule 설정예

1. http://yourdomain.com/user_id  ->  http://yourdomain.com/home.php?id=user_id

 

RewriteRule ^/([a-zA-Z0-9])$   /home/user_id/public_html/home.php?id=$1

설명 : 도메인(http://yourdomain.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜줍니다. 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.

 

2. http://yourdomain.com/daum  -> http://www.daum.net

RewriteRule ^/daum$  -> http://www.daum.net

설명 : http://yourdomain.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜줍니다.



RewriteOptions

설정문법 : RewriteOptions Options

현재 사용할 수 있는 option 은 MaxRedirects=number 를 사용할 수 있으며 설정된 number값에 도달하게 되면 500 Internal Server Error 를 남기고 RewriteRule을 종료합니다.

잘못된 RewriteRule에 의한 무한 루프를 방지하기 위한 목적으로 사용되는데 시스템이 이유없이 다운된다거나 할 때 이 옵션과 Log 기록을 참고하여 디버깅 및 시스템 다운을 방지할 수 있습니다.


이 지사자는 Apache 2.0.45 이상에서 사용할 수 있습니다.


3. 실제 적용예

가상호스트 blog.xxx.ac.kr 에 대해 Rewrite Rule을 적용한 예입니다. 이 부분은 실제 운영되는 블로그 사이트를 위해 RewriteRule 을 적용한 예입니다.


DocumentRoot /home/blog/html

ServerName blog.xxx.ac.kr

# 여기까지는 일반적인 가상호스트 설정입니다.

RewriteEngine on

# RewriteRule을 사용하기 위해 On 으로 설정합니다.

 

RewriteLog /home/blog/rewrite_log_admin3.log

RewriteLogLevel 9

# Rewrite 실행중 Log를 남기기 위해 로그파일과 로그레벨을 지정했습니다.

 

RewriteRule ^/tb/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/trackback\.php\?id=$1&post_no=$2

# 위설정은 블로그에 등록된 포스트의 트랙백 주소를 부여하기 위해 설정한 RewriteRule 로써 Pattern에 두개의 그룹이 존재하고 return URL에 순서대로 각 그룹을 $1 과 $2 로 받아 GET 변수로 치환한것입니다.

 

RewriteRule ^/xml/([a-zA-Z0-9]+)$ /home/blog/html/blog/rss_feed\.php\?id=$1

# 각블로그별 RSS 주소를 실제 파일로 지정한것입니다.

 

RewriteCond %{REQUEST_URI}     !^/admin$

RewriteRule ^/([a-zA-Z0-9]+)$ /home/blog/html/blog/main\.php?id=$1

# 먼저 RewriteCond 로 실제 존재하는 admin 이라는 디렉토리를 이어지는 RewriteRule에서 제외시키고 http://domain.com/user_id 로의 요청을 모두 /home/blog/html/blog/main.php?id=user_id로 redirect 시키는 룰입니다.

 

RewriteRule ^/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/main\.php\?id=$1&post_no=$2

# /user_id/1345 로 요청하는 페이지를 /home/blog/html/blog/main.php?id=user_id&post_no=1345 로 redirect 시키는 룰입니다.

 

 

4. 마치면서

위에서 언급한 RewriteRule 뿐만 아니라 여러가지 상황에서 RewriteRule을 잘 활용한다면 아주 유용하게 웹페이지를 컨트롤 할수 있습니다.

RewriteRule 을 세팅하기 이전에 반드시 정규표헌식에 대해 어느정도 공부한후 적용해 보실 것을 권합니다.

AND

- with(nolock) 은...
set transaction isolation level read uncommitted;
로 해결.


- TOP은 LIMIT로 변경.
ex.
SELECT TOP 10 * FROM books
-->
SELECT * FROM books LIMIT 10;


- IF는 ENDIF와 pair여야한다.
ex.
IF (condition) THEN
do sth;
END IF;


- Auto increment
ex.
SET @id = @@IDENTITY
SET @id = IDENTITY_CURRENT()
-->
SET @id = LAST_INSERT_ID();

- Stored Procedure
delimiter를 이용해 ;를 변경하고 다시 원상복귀
ex.
delimiter //
CREATE PROCEDURE xProc
do sth;
END;
//
delimeter ;


- Data type 비교

수치 자료형


MySQL
Size
SQL
Server 2000

TINYINT
1 Byte
TINYINT
SMALLINT 2 Bytes SMALLINT
MEDIUMINT 3 Bytes
INT 4 Bytes INT
INTEGER 4 Bytes INT
BIGINT 8 Bytes BIGINT
FLOAT(X<=24) 4 Bytes FLOAT(0)
FLOAT(25<=X<=53)
8 Bytes FLOAT(25)
DOUBLE 8 Bytes FLOAT(25)
DOUBLE PRECISION 8 Bytes FLOAT(53)
REAL 8 Bytes REAL
DECIMAL M Bytes(D+2, if M<D)
DECIMAL
NUMERIC M Bytes(D+2, if M<D) NUMERIC

날짜 시간 자료형



MySQL Size SQL er 2000
DATE
3 Bytes SMALLDATETIME
DATETIME 8 Bytes DATETIME
TIMESTAMP 4 BytesTIMESTAMP
TIME 3 Bytes SMALLDATETIME
YEAR 1 Byte
SMALLDATETIME

 
문자열형


MySQL
Size SQL Server 2000
CHAR(m) M Bytes, 1<=M<=255 CHAR
VARCHAR(m) L+1
Bytes where L<=M and 1<=M<=255
VARCHAR

TINYBLOB
L + 1 Bytes where L<2^8 BINARY
BLOB L + 2 Bytes where L<2^16
VARBINARY
TEXT L + 2 Bytes where L<2^16 TEXT
MEDIUMBLOB L + 3 Bytes where L<2^24 IMAGE
MEDIUMTEXT L + 3 Bytes where L<2^24 TEXT
LONGBLOB L + 4 Bytes where L<2^32 IMAGE
LONGTEXT L + 4 Bytes where L<2^32 TEXT
ENUM
(VALUE1, VALUE2, …)
데이터형이 1또는 2바이트를차지하는지는 그값의 수치로판단된다. 매칭되는 자료형이 없으나 CHECK 제약을
이용해 구현 가능하다.
SET
(VALUE1, VALUE2, …)
1, 2, 3, 4 또는 8 바이트

Set 멤버들의 최대값에 의존적인 값이다.




AND

MySQL 한글 설정

개발/mysql 2008. 2. 18. 16:01
아놔, 한글 설정 너무 어렵다...
이럴때는 한글 쓰는게 정말 서럽다.
자나깨나 한글설정 조심. --+

MySQL 5.0 한글 설정(utf8, euckr)
http://maxnim.tistory.com/1166706275

MySQL 5.0 설치팁
http://www.javamaster.org/lecture/mysql/mysql_install.html

mysql-데이터베이스 설치(utf-8 설정)
http://ikinox.tistory.com/entry/mysql-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EC%B9%98utf-8-%EC%84%A4%EC%A0%95

ex.
euc-kr인 경우에는 다음과 같이 설정한다.
(난, utf8이 조은데... )

my.cnf를 다음과 같이 고친다.
(utf8인 경우는 euckr만 utf8로 수정)

[mysql]
default-character-set = euckr

[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection = euckr_korean_ci"
init_connect="SET NAMES euckr"
default-character-set = euckr
character-set-server = euckr

collation-server = euckr_korean_ci

[client]
default-character-set = euckr

[mysqldump]
default-character-set = euckr

결과 확인은 mysql 내에서,
status; 나
show variables; 로 확인 가능하다.

AND

Mediawiki 설치

개발/기타 2008. 2. 15. 16:42
Mediawiki를 설치해 봤습니다.

자세한 설정법은 http://www.mediawiki.org/wiki/Manual:Installing_MediaWiki/ko 를 참조하면 됩니다.

저는 mediawiki-1.11.1을 설치했는데, 그냥 설치하게 되면 위키가 보이기는 하는데,

여기저기 #ifeq 등 ParserFunctions 등이 없다며 지저분하게 나오네요.

이를 해결하기 위해서는 mediawiki extension을 설치해야 합니다.

자세한 설치과정은 http://www.mediawiki.org/wiki/Manual:Extensions 에 나와있습니다만, 정리하면...

svn checkout http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/ 를 수행한 후,
( 물론 ParserFunctions만 설치해도 된다 )

LocalSettings.php 파일 내에 다음을 추가한다.
require_once "$IP/extensions/ParserFunctions/ParserFunctions.php";
AND

개인적으로 삽질했던 문제해결 리스트(Troubleshooting List)  2탄

Slave 재부팅시에 Slave가 동작하지 않는 경우가 발생한다면?

master.info와 relay-log.info를 확인하여,
설정이 유효한지 확인한다.

그런데도, syslog에 아래와 같은 문제가 발생한다면?

[Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=/var/run/mysqld/mysqld-relay-bin' to avoid this problem.

my.cnf에 relay-log 설정을 추가한다.

그럼에도 불구하고 다음과 같이 에러가 계속 된다면?

[ERROR] Failed to open the relay log '/var/run/mysqld/mysqld-relay-bin.000045'

원하는 relay-log를 찾지 못하는 현상이 일어나므로,
relay-log의 위치를 변경한다.

일반적으로 /var/run에는 재부팅 전까지만 유효한 내용들을 넣어두므로,
다른 안전한 곳으로 옮기는 것도 괜찮다.

옮기는 김에, relay-log.info, master.info의 위치도 변경해 보자.
여기서는 좀 부잡스럽지만 일단 /var/log/mysql 아래에 다 넣는다.

relay-log = /var/log/mysql/mysqld-relay-bin
master-info-file = /var/log/mysql/master.info
relay-log-info-file = /var/log/mysql/relay-log.info


AND

pymssql을 MySQLdb로 이전할 때,
인터페이스 상으로는 DB API 2.0을 둘다 지원하니 크게 바꿀 부분이 없을 것 같네요.

connect 함수의 입력인자 password, database 가 passwd, db 로만 바꿔주면 될 듯...

ex.
conn = MySQLdb.connect(
   host = '아무데나',
   user = '아무나',
   passwd = '****',
   db = 'dbname'
)
cs = conn.cursor()
cs.execute(sql)
res = cs.fetchall()
...

그 외에 문제가 넘처 흐르겠지만,
추후에 정리할 날이 온다면 정리할랍니다 :)
AND

초간단 Replication overview

Replication은 master의 내용을 여러 slave들에게 복사본을 유지시키는 것을 의미한다.
즉, 아래 그림의 경우와 같이 write는 비교적 적게 일어나고,
read가 자주 일어나는 웹사이트들의 경우에 load balancing을 위해 사용할 수 있을 것이다.


그림 출처: http://dev.mysql.com/doc/refman/5.0/en/replication-solutions-scaleout.html

Replication 관련 주의해야할 사항 및 troubleshooting 관련글들은 아래 mysql 사이트를 참조하도록 한다.
http://dev.mysql.com/doc/refman/5.0/en/replication-features.html



개인적으로 삽질했던 문제해결 리스트(Troubleshooting List) ...

1. replication 후 slave에서 master에 연결이 안될 때.

slave로 master의 db를 dump를 하게 되면,
user 정보들도 모두 dump하게 된다.

즉, 다음에 slave를 리부팅했을 경우 오류가 날 수 있다.
일례로 /etc/mysql/debian.cnf 안에 보면,
password가 master의 것으로 바뀌게 되므로 slave의 세팅을
master의 세팅과 동일하게 맞춰주어야 될 지도 모른다.


2. slave 혹은 master의 문제로 인해 다시 동기화를 해야할 경우.

dump한 후 다시 stop, start slave를 시킨다.
혹시 relay-log를 못 따라가며 안되면,... 무식하게,
mysql> RESET SLAVE;
를 한 후, 다시 설정/시작 시킨다..

3. Slave가 꺼져있는 동안 Master에서 update가 일어나는 경우.

Slave에서 동기화 에러가 날 수 있다.
다시 동기화할때 Slave단에서 duplication 등의 에러가 날 수 있는데,
(무시해 줘도 되는 경우...)
그리 치명적인 에러가 아니면 my.cnf 내에서 slave-skip-errors 옵션을
이용해서 무시해주면 된다.
slave-skip-errors = 1061, 1062
모든 에러를 다 건너뛰려면, slave-skip-errors = all 로 세팅하면 된다.


4. 에러가 난 경우, 해당 쿼리를 확인/건너뛰는 방법.

우선 Slave에서 Exec_Master_Log_Pos 위치 확인.
mysql> SHOW SLAVE STATUS\G

Master에서 근처에 어떤 쿼리가 있는지 확인.
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000032' FROM 13633 LIMIT 3 \G

문제가 없다면 다음 위치로 이동.
mysql> SLAVE STOP;
mysql> CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000032',
MASTER_LOG_POS=13770;
mysql> SLAVE START;
mysql> SHOW SLAVE STATUS \G

혹은 확인 결과 현재 에러가 skip해도 된다면,
mysql> SLAVE STOP;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> SLAVE START;

AND