'Computing/MySQL'에 해당되는 글 5건
- 2011.11.04 mysql 복구
- 2010.11.17 [Mysql] 쿼리문 내에서 encoding 변경...
- 2007.07.25 [펌]MySql 복구 방법
- 2007.07.25 [펌]MySQL Cluster
1. REPAIRTABLE 테이블명
2. 위의 명령으로 복구 되지 않을땐 데몬중지후 해당 테이블이 있는 디렉토리로 이동하여
$ myisamchk -r 테이블명
'Computing > MySQL' 카테고리의 다른 글
[Mysql] 쿼리문 내에서 encoding 변경... (0) | 2010.11.17 |
---|---|
[펌]MySql 복구 방법 (0) | 2007.07.25 |
[펌]MySQL Cluster (0) | 2007.07.25 |
[펌]MySQL Replication 설치 (3) | 2007.07.25 |
1.
출처 : http://dev.mysql.com/doc/refman/5.1/en/charset-convert.html
9.1.9.2. CONVERT()
and
CAST()
CONVERT()
provides a way to
convert data between different character sets. The syntax is:
CONVERT(expr
USINGtranscoding_name
)
In MySQL, transcoding names are the same as the corresponding character set names.
Examples:
SELECT CONVERT(_latin1'Müller' USING utf8);
INSERT INTO utf8table (utf8column)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;
CONVERT(... USING ...)
is
implemented according to the standard SQL specification.
You may also use CAST()
to
convert a string to a different character set. The syntax is:
CAST(character_string
AScharacter_data_type
CHARACTER SETcharset_name
)
Example:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);
If you use CAST()
without
specifying CHARACTER SET
, the
resulting
character set and collation are defined by the
character_set_connection
and
collation_connection
system
variables. If you use CAST()
with CHARACTER SET X
, the
resulting
character set and collation are X
and the
default collation of X
.
You may not use a COLLATE
clause
inside a
CONVERT()
or
CAST()
call, but you may use it
outside. For example, CAST(... COLLATE
...)
is illegal, but CAST(...)
COLLATE ...
is legal:
SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
2.
출처 : http://database.sarang.net/?inc=read&aid=25074&criteria=mysql&subcrit=&id=&limit=&keyword=&page=
안녕하세요. fedora core 2가 나온 기념으로 udf 하나 만들어 봤습니다.
예전에 문자셋 인코딩 어떻게 하는건지 몰라 헤맸는데 iconv이라는 라이브러리가 있다는 것을 최근에 알았답니다..-.-;;
글구 fedor core 2가 문자셋을 utf-8로 전환함에 따라 mysql client에서 udf-8로 저장된 데이타는 깨져서 나오더군요. 그래서 iconv UDF가 필요하게 됐답니다. phpMyAdmin는 알아서 iconv를 적용하더군요. 정말 phpMyAdmiin은 짱입니다..-.-;;
g++ -shared -o mysql_udf_iconv iconv.so iconv.cpp -I/usr/include/mysql -liconv (컴파일)
mysql_udf_iconv.so를 /usr/lib/에 옮겨둡니다.
create function ICONV returns string soname "mysql_udf_iconv.so" (함수등록)
select iconv(data_field, "udf-8", "euckr") from table; (함수사용)
테스트는 알아서...-.-;;
소스입니다.
#include <stdio.h>
#include <string.h>
#include <iconv.h>
#include <mysql.h>
extern "C" my_bool ICONV_init(UDF_INIT* initid, UDF_ARGS* args, char* message);
extern "C" void ICONV_deinit(UDF_INIT* initid);
extern "C" char* ICONV(UDF_INIT* initid, UDF_ARGS* args, char* result,
unsigned long* length, char* is_null, char* /*error*/);
const int BufSize = 65536; //65535(64KB)+1
static iconv_t cd;
my_bool ICONV_init(UDF_INIT* initid, UDF_ARGS* args, char* message)
{
enum Item_result* type = args->arg_type;
if(args->arg_count != 3 || type[0] != STRING_RESULT || type[1] != STRING_RESULT || type[2] != STRING_RESULT)
{
strcpy(message,"Wrong arguments to iconv");
return 1;
}
cd = iconv_open((const char *)args->args[1], (const char *)args->args[2]);
if(cd == (iconv_t)-1)
{
strcpy(message, "iconv_open() failed");
return 1;
}
initid->ptr = new char[BufSize];
if(!initid->ptr)
{
strcpy(message, "Memory alloc failed");
return 1;
}
initid->max_length = BufSize;
return 0;
}
void ICONV_deinit(UDF_INIT* initid)
{
iconv_close(cd);
if(initid->ptr)
delete[] initid->ptr;
}
char* ICONV(UDF_INIT* initid, UDF_ARGS* args, char* result,
unsigned long* length, char* is_null, char* /*error*/)
{
const char* inBuf = args->args[0];
size_t inByteLeft = args->lengths[0];
char* outBuf = initid->ptr;
size_t outByteLeft = BufSize;
size_t ret;
while(1)
{
ret = iconv(cd, &inBuf, &inByteLeft, &outBuf, &outByteLeft);
if(!inByteLeft)
break;
if(ret == (size_t)-1)
break;
}
*length = BufSize - outByteLeft;
return initid->ptr;
}
짧죠?
버그 나오면 알아서 고쳐주시고 저한텐 알려주지 마세요..ㅠ.ㅠ
'Computing > MySQL' 카테고리의 다른 글
mysql 복구 (0) | 2011.11.04 |
---|---|
[펌]MySql 복구 방법 (0) | 2007.07.25 |
[펌]MySQL Cluster (0) | 2007.07.25 |
[펌]MySQL Replication 설치 (3) | 2007.07.25 |
결국 복구는 했지만 백업화일을 만들어 두지 않아서 나름 귀찮고 힘든 과정이었다.
그래서 mysql 를 날렸을때 복구하는 방법을 간단하게나마 설명하고자 한다.
root 계정으로 작업하고 /usr/local/mysql 을 기본 디렉토리로 본다는 가정하에.. ^^
mysqldump를 이용한 백업화일이 존재하는 경우
/usr/local/mysql/bin/mysql -u root -p < BackUp.sql
가장 쉽게 복구하는 방법이다.
하지만 이 경우 문제점이 있다.
Cron 등의 프로그램으로 매일 백업을 받는다고 하더라도...
백업받은 시점과 DB를 날린 시점에서의 데이터는 다를수 있기 때문이다.
그런 부분을 커버 할수 있는것이 binlog 이다.
원래 binlog는 replication 을 위한 것인데... replication 이 아닌 복구용도로도 훌륭한 데이터이다.
/etc/my.cnf 에..
log-bin 라는 부분이 주석처리 되어 있지않으면..
mysql 은 기본적으로 /usr/local/mysql/data 디렉토리에 Host명-bin.000001 Host명-bin.000002 .... 과 같은
형식으로 만들어 질것이다. mysql을 재시작할때마다 Host명-bin.0000001 에서 숫자부분이 늘어난 화일이
생성되며 그 화일에 새롭게 기록한다.
※ mysql binlog 디렉토리 설정
my.cnf 에서
log_bin = /usr/local/mysql/data/mysql-bin.log <== 이런식의 설정도 가능하다.
bin 로그에는 기본적으로 DDL(Create, Alter, Drop)문과 DML중 Insert Update Delect 문등이 기록되는데..
이 기록들은 기본적으로 데이터에 변화를 주는 SQL문들이다..
bin 로그를 보려면 log의 데이터를변환해야한다.
binlog는 기본적으로 바이너리로 되어 있기에 텍스트 형태로 푸는 과정이 필요하다.
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/Host명-bin.000001 >> 1.sql
이와 같은 과정으로 모든 binlog를 푼다..
vi 등으로 보면 시간 및 각각의 sql문들이 보일것이다..
※ 로그화일 쪼개기
가끔 log 화일이 너무 커서 제대로 인식이 안되는 경우가 있다.
이런 경우 split 이라는 훌륭한 툴이 있다.
split -l 100000 1.sql
10만 라인별로 1.sql 을 xaa, xab, aac..... 순으로 화일이 생성되면서 짜른다.
자 이제 복구를 하자라고 하고 싶지만..
여기서 주의 할것이 있다..
처음에... drop database 같은 sql 을 날렸다면
이 역시 binlog에 포함되어 있을것이다.
맨 마지막 로그 화일을 열어서 그부분을 삭제 또는 주석처리하자..
그렇지 않으면 애써 복구한것을 마지막에 다시 또 날리는 되는 결과를 .....
이제서야 복구를 할수 있을것이다.
/usr/local/mysql/bin/mysql -u root -p < 1.sql
만약 여기서도 5만줄쯤에서 오류가 났다라고 한다면...
1.sql 에서 1~49999 까지는 실행이 되었다.
그러므로 1~49999 를 삭제(vi 로 연다음 d49999 이라고 입력하고 Enter ...)한다.
그리고 문제가 되는 첫줄(1~49999를 삭제하기전에는 오류가 난 5만번째라인)의 SQL 부분을 해결한다음...
저장....
그리고 다시 복구과정을 반복
/usr/local/mysql/bin/mysql -u root -p < 1.sql
php 스쿨 [서버운영] Drop 된 Mysql Binlog를 이용한 복구 과정 에서 퍼 왔습니다.
'Computing > MySQL' 카테고리의 다른 글
mysql 복구 (0) | 2011.11.04 |
---|---|
[Mysql] 쿼리문 내에서 encoding 변경... (0) | 2010.11.17 |
[펌]MySQL Cluster (0) | 2007.07.25 |
[펌]MySQL Replication 설치 (3) | 2007.07.25 |
MySQL Cluster
저작권:이 문서는 자유롭게 배포가 가능합니다. 단 상업적 용도로 사용할 수 없습니다.
배포 시 작성자의 이름 및 출처를 꼭 명시하기 바랍니다.
작성자 : f405(ccotti22)
작성일 : 2005년 8월 10일 수요일
이메일 : f405@naver.com
홈페이지 : http://f405.tistory.com
이 문서는 MySQL Cluster 매뉴얼을 번역, 정리한 것으로 틀린 부분을 다소 포함할 수 있으며, 저는 그에 대한 책임을 지지 않겠습니다.
부족하지만 다른 분들도 공부하는데 도움이 되길 바랍니다.
그리고 이 문서를 작성하기 전 참고한 리눅스 및 MySQL 문서들을 작성하신 많은 선배님들에게 감사의 말씀을 드립니다.
그리고 이 후부터는 경어는 생략하였습니다. 양해의 말씀을...
Introduction
MySQL 클러스터는 분산 컴퓨팅 환경에서 high-availability와 high-redundancy를 채택하였다. MySQL 클러스터는 NDB 클러스터 스토리지 엔진을 사용하여, 클러스터에서 여러 개의 서버가 함께 돌아가도록 한다. MySQL 클러스터가 지원하는 운영 체제는 Linux, Mac OS X, Solaris 등 이다. 더 자세한 정보는 다음 사이트를 참고 하길 바란다.
http://www.mysql.com/products/cluster
1. MySQL Cluster Overview
MySQL 클러스터는 share-nothing 시스템에서 in-memory 데이터 베이스의 클러스터링을 가능하게 한다. 이러한 아키텍쳐는 특정한 하드웨어 및 소프트웨어를 요구하지 않으므로 비용을 절감할 수 있도록 하며, 각 콤포넌트가 고유 메모리와 디스크를 보유함으로 단일 취약점(single point of failure)을 가지지 않는다.
2. Basic MySQL Cluster Concepts
NDB는 높은 가용성과 데이터 지속성을 갖는 인 메모리 스토리지 엔진이다. DB 스토리지 는 failover와 로드 밸런싱 옵션을 설정할 수 있다. MySQL 클러스터는 NDB 스토리지 엔진과 MySQL 서버로 구성되어 있으며, MySQL 클러스터의 클러스터 부분은 MySQL 서버에 독립적이다. MySQL 클러스터의 각 부분은 노드로 간주한다.
"노드"는 일반적으로 컴퓨터를 지칭하지만 MySQL 클러스터에서는 "프로세스"를 말한다.
- MGM node : 이 노드는 설정을 포함, 다른 노드를 관리하는 매니저 노드이다.
다른 노드보다 가장 먼저 실행되며 ndb_mgmd 명령으로 실행시킨다.
- data node : 클러스터의 데이터를 저장하는 노드이다.
ndbd 명령으로 실행시킨다.
- SQL node : 클러스터 데이터에 접근하는 노드이다.
MySQL 클러스터에서는 NDB 클러스터 스토리지 엔진을 사용하는
MySQL 서버가 클라이언트 노드이다.
mysqld --ndbcluster나 mysqld 명령으로 실행시키는데,
이 때는 my.cnf 에 ndbcluster를 추가한다.
Simple Multi-Computer How-To
다음과 같이 4대의 컴퓨터로 클러스터를 구성하는 것을 가정하고 있다. (4개의 노드로 구성되고, 각각의 노드는 편이성을 위해 IP로 지칭한다.)
Node |
IP Address |
Management (MGM) node |
192.168.0.10 |
MySQL server (SQL) node |
192.168.0.20 |
Data (NDBD) node "A" |
192.168.0.30 |
Data (NDBD) node "B" |
192.168.0.40 |
설치 및 사용 시 주의할 점은 MySQL 클러스터는 클러스터 노드 간 커뮤니케이션에 암호화 및 보호 장치가 전혀 없으므로, 웹 상에서 사용하려면 방화벽을 사용하는 등의 보안상의 대책이 필요하다는 것이다.
MySQL Cluster를 사용하기 위해서는 -max 버전을 설치해야 한다.
모든 설치는 root권한으로 진행하며 작업에 필요한 파일은 /usr/local/ 에 저장한다.
# cd /usr/local
# groupadd mysql
# useradd -g mysql mysql
# tar -xzvf mysql-max-4.1.13-pc-linux-gnu-i686.tar.gz
# ln -s /usr/local/ mysql-max-4.1.13-pc-linux-gnu-i686 mysql
# cd mysql
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# chgrp -R mysql .
5. 시스템 부팅 시 자동적으로 Mysql을 실행할 수 있도록 설정한다.
# cp support-files/mysql.server /etc/rc.d/init.d/
# chmod +x /etc/rc.d/init.d/mysql.server
# chkconfig --add mysql.server
6. MGM (management) 노드를 별도의 PC에 설치할 경우 mysql 데몬은 설치하지 않아도 무방하다. 위와 같이 설치한 후 MGM 서버는 다음과 같이 설치를 계속한다.
# cd /usr/local/mysql/bin/
# cp ndb_mgm* /usr/local/bin/
# chmod +x ndb_mgm*
# vi /etc/my.cnf
[MYSQLD] # Options for mysqld process:
Ndbcluster # run NDB enginen
db-connectstring=192.168.0.10 # location of MGM node
[MYSQL_CLUSTER] # Options for ndbd process:
ndb-connectstring=192.168.0.10 # location of MGM node
# mkdir /var/lib/mysql-cluster# cd /var/lib/mysql-cluster
# vi config.ini
[NDBD DEFAULT] # Options affecting ndbd processes on all data nodes:
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough
# for this example Cluster setup.
[TCP DEFAULT] # TCP/IP options:portnumber=2202
# This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: In MySQL 5.0, this parameter is deprecated;
# it is recommended that you do not specify the
# portnumber at all and simply allow the port to be
# allocated automatically
[NDB_MGMD] # Management process options:
hostname=192.168.0.10 # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster # Directory for MGM node logfiles
[NDBD] # Options for data node "A":
# (one [NDBD] section per data node)
hostname=192.168.0.30 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's
# datafiles
[NDBD] # Options for data node "B":
hostname=192.168.0.40 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's
# datafiles
[MYSQLD] # SQL node options:
hostname=192.168.0.20 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for SQL node's datafiles
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
# ndb_mgmd -f /var/lib/mysql-cluster/config.iniMGM 노드를 다운시킬 때에는 다음과 같이 하면 된다.
# ndb_mgm -e shutdown
# ndbd --initial
# /etc/rc.d/init.d/mysql.server start
# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm>
ndb_mgm> show
Connected to Management Server at: 192.168.0.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.30 (Version: 4.1.13, Nodegroup: 0, Master)
id=3 @192.168.0.40 (Version: 4.1.13, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.10 (Version: 4.1.13)
[mysqld(API)] 1 node(s)
id=4 (Version: 4.1.13)
ndb_mgm>
3. MySQL 클러스터의 제한
- 트랙잭션 수행 중의 롤백을 지원하지 않으므로, 작업 수행 중에 문제가 발생하였다면, 전체 트랙잭션 이전으로 롤백하여야 한다.
- 실제 논리적인 메모리의 한계는 없으므로 물리적으로 허용하는 만큼 메모리를 설정하는 것이 가능하다.
- 컬럼 명의 길이는 31자, 데이터베이스와 테이블 명은 122자까지 길이가 제한된다. 데이터베이스 테이블, 시스템 테이블, BLOB인덱스를 포함한 메타 데이터(속성정보)는 1600개까지만 가능하다.
- 클러스터에서 생성할 수 있는 테이블 수는 최대 128개이다.
- 하나의 로우 전체 크기가 8KB가 최대이다(BLOB를 포함하지 않은 경우).
- 테이블의 Key는 32개가 최대이다.
- 모든 클러스터의 기종은 동일해야 한다. 기종에 따른 비트저장방식이 다른 경우에 문제가 발생하기 때문이다.
- 운영 중 스키마 변경이 불가능하다.
- 운영 중 노드를 추가하거나 삭제할 수 없다.
- 최대 데이터 노드의 수는 48개이다.
- 모든 노드는 63개가 최대이다. (SQL node, Data node, 매니저를 포함)
4. MySQL Cluster FAQ
(SizeofDatabase * NumberOfReplicas * 1.1 ) / NumberOfDataNodes
5. MySQL Cluster Glossary
- ndbd : 데이터 노드 데몬
- ndb_mgmd : MGM서버 데몬
- ndb_mgm : MGM 클라이언트
- ndb_waiter : 클러스터의 모든 노드들의 상태를 확인할 때 사용
- ndb_restore : 백업으로부터 클러스터의 데이터를 복구할 때 사용
이미지 #1
첫번째 이미지
이미지 #2
두번째이미지
'Computing > MySQL' 카테고리의 다른 글
mysql 복구 (0) | 2011.11.04 |
---|---|
[Mysql] 쿼리문 내에서 encoding 변경... (0) | 2010.11.17 |
[펌]MySql 복구 방법 (0) | 2007.07.25 |
[펌]MySQL Replication 설치 (3) | 2007.07.25 |