2009년 10월 15일 목요일

MySQL Table 복구 - Got error 127 from storage engine

1. 에러 메세지

ERROR 1030 (HY000): Got error 127 from storage engine

2. 복구 절차

Analyze Table `Table Name`
Repair Table `Table Name`
3. 예제보기

mysql> SELECT COUNT(A.IDX) AS 'CNT' FROM PRO_QNA_T A WHERE A.TYPE > 0;
ERROR 1030 (HY000): Got error 127 from storage engine
mysql>
mysql>
mysql> Analyze PRO_QNA_T;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PRO_QNA_T' at line 1
mysql> Analyze Table PRO_QNA_T;
+--------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------+---------+----------+----------+
| ihelpers.PRO_QNA_T | analyze | status | OK |
+--------------------+---------+----------+----------+
1 row in set (0.01 sec)

mysql> Repair Table PRO_QNA_T;
+--------------------+--------+----------+--------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+--------+----------+--------------------------------------------+
| ihelpers.PRO_QNA_T | repair | info | Key 1 - Found wrong stored record at 24884 |
| ihelpers.PRO_QNA_T | repair | warning | Number of rows changed from 2187 to 2186 |
| ihelpers.PRO_QNA_T | repair | status | OK |
+--------------------+--------+----------+--------------------------------------------+
3 rows in set (0.17 sec)

mysql> Analyze Table PRO_QNA_T;
+--------------------+---------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+---------+----------+-----------------------------+
| ihelpers.PRO_QNA_T | analyze | status | Table is already up to date |
+--------------------+---------+----------+-----------------------------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(A.IDX) AS 'CNT' FROM PRO_QNA_T A WHERE A.TYPE > 0;
+------+
| CNT |
+------+
| 2186 |
+------+
1 row in set (0.01 sec)

MySQL 테이블 속성 변경하기

1. 테이블의 필드명을 다른 이름으로 변경
mysql>alter table 테이블명 change 기존필드명 바꿀필드명 바뀐필드타입;

2. 기존 필드의 타입을 다른 타입으로 변경
mysql>alter table 테이블명 modify 필드명 바꿀필드타입;

3. 테이블에 새로운 필드 추가
mysql>alter table 테이블명 add 추가할필드명 필드타입;

*추가할 필드를 기존 테이블의 제일 마지막에 위치
mysql>alter table 테이블명 add 추가할필드명 필드타입;

*추가할 필드를 기존 테이블의 제일 첫번째에 위치
mysql>alter table 테이블명 add 추가할필드명 필드타입 first;

*추가할 필드를 기존 테이블의 중간에 위치
mysql>alter table 테이블명 add 추가할필드명 필드타입 after 생성될필드가 위치할 앞 필드명;

4. 특정한 필드 삭제
mysql>alter table 테이블명 drop 삭제할필드명;

5. 테이블명 변경
mysql>alter table 테이블명 rename 바뀔테이블명;

2009년 10월 14일 수요일

MySQL my.cnf 설정파일

=================================================================

my.cnf

=================================================================
-- 용도별 카피

my-small.cnf : 64M
my-medium.cnf : 128-256M
my-large.cnf : 512M
my-huge.cnf : 1~2G



[mysqld]

key_buffer

- 인덱스를 위한 버퍼 공간
- 키버퍼의 크기는 공유된 쓰레드의 크기이며 중복된 키를 자주 사용할 경우 속도증진
- show status 의 Key_blocks_used 를 체크
Key_blocks_used * 1024 의 2~3 배 ... (메모리충분할 경우)
Key_blocks_used * 1024 (보통)

ex) 아래와 같은 상태가 될때가 key_buffer 가 적당..
Key_reads / Key_read_request < 0.01
key_write / Key_write_requests = 1


max_connections

- show status 의 max_used_connections 를 체크 (최대값보다 10% 크게 설정)

table_cache

- MySQL 서버가 한번에 열수 있는 테이블의 개수설정
- show status 의 Opened_tables 값이 클 경우 table_cache 를 늘림
- max_connections 값이 100 일 경우 100 * n (조인해서 열수 있는 최대테이블개수)
ex) 테이블 20 , max_connections 100 이라면
table_cache = 512


sort_buffer / record_buffer

- max_used_connections 의 값에 따라 증가
- 한번에 많은 쓰레드가 동시에 붙을 경우는 증가
- max_used_connections 가 높은 경우
sort_buffer=6M
record_buffer=2M
(sort_buffer + record_buffer < 8M)
- 메모리가 4G 정도 된다면 sort_buffer 값을 32M 정도를 잡는 것이 좋다.
- order by , group by 절을 빠르게 하기 위해서 sort_buffer 값을 증가시킬수 있다.
- 많은 연속적인 테이블 스캔이 이루어진다면 record_buffer 값을 증가


thread_cache / thread_concurrency

- cpu 개수 * 2



-- 퀴리캐시 설정 방법

set-variable = query_cache_limit=1M
set-variable = query_cache_size=2M
set-variable = query_cache_type=1

-> 쿼리캐시 사용 안할려면 query_cache_size = 0 으로 설정.
-> query_cache_type
1) 0 : off 쿼리캐시 기능을 사용하지 않음
2) 1 : on , SELECT SQL_NO_CACHE 를 제외하고 쿼리캐시사용
3) 2 : DEMAND, SELECT SQL_CACHE 사용시만 쿼리캐시사용

-> 쿼리캐시 변수보기
show variables like 'query%';

+-------------------+----------+
Variable_name Value
+-------------------+----------+
query_cache_limit 1048576
query_cache_size 33554432
query_cache_type ON
+-------------------+----------+

-> 쿼리캐시 상태보기
show status like 'qcache%';

+-------------------------+----------+
Variable_name Value
+-------------------------+----------+
Qcache_queries_in_cache 12780 : 캐시에 등록된 쿼리수
Qcache_inserts 2084642 : 캐시에 추가된 쿼리수
Qcache_hits 173194 : 캐시에 있는 쿼리를 사용한 수
Qcache_lowmem_prunes 361897
Qcache_not_cached 23724 : 쿼리를 캐시에 저장하지 않은 수
Qcache_free_memory 20055720 : 캐시가 남은 공간
Qcache_free_blocks 6237 : 쿼리캐시에서 남은 메모리 블록
Qcache_total_blocks 32000 : 쿼리캐시가 사용하는 총 블록 수
+-------------------------+----------+
-> FLUSH
FLUSH QUERY CACHE 쿼리 캐시를 재정렬하므로 메모리를 유용하게 사용하도록 해준다.
(단 쿼리캐시를 비우지는 않는다)

FLUSH TABLES 쿼리 캐시 버퍼를 비운다.
( Qcache_queries_in_cache = 0 , Qcache_table_blocks = 1

FLUSH QUERY CACHE 는 모든 쿼리 캐시를 삭제



-- 로그설정

log-isam=파일경로
log-slow-queries=파일경로
long_query_time=5



EX ) MySQL 메모리 사용량

innodb_buffer_pool_size
+ key_buffer
+ max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)
+ max_connections * 2MB





=================================================================

튜닝참조

=================================================================

1. Opened_tables가 크면 table_cache variable의 값이 너무 작은것일지도 모른다

2. key_reads가 크면 key_cach의 값이 너무 작은것일지도 모른다

3. cache hit rate은 key_reads/key_read_requests이다

4. Handler_read_rnd가 크면 MySQL의 모든 테이블을 스캔하는 많은 쿼리가 있다거나 key를 적절히 사용하지 않는 조인들이 있을지 모른다

5. Threads_created가 크면 thread_cache_size값을 증가시키기를 바랄수도 있다

6. Created_tmp_disk_tables이 크면 디스크대신 임시테이블메모리를 얻기위해 tmp_table_size값을 증가시키기를 원할 수있다

7. 기본적으로 support-files밑에 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 를 기본으로 my.cnf 로 바꾸어 사용하면서 조정한다.

- memory (>=256M)이고 많은 테이블이 있으며, 적당한 클라이언트수에서 최고 성능을 유지하기 위해
shell> safe_mysqld -O key_buffer=64M -O table_cache=256 -O sort_buffer=4M -O record_buffer=1M &
이러한 옵션으로 서버를 실행하는데, my-cnf에서 이를 수정하여 사용하면 될 것이다.

- 128M메모리에 테이블이 적지만, 정렬이 많을 때
shell> mysqld_safe -O key_buffer=16M -O sort_buffer=1M

- 메모리는 적지만 많은 연결이 있을 때
shell> mysqld_safe -O key_buffer=512k -O sort_buffer=100k -O record_buffer=100k &
또는
shell> mysqld_safe -O key_buffer=512k -O sort_buffer=16k -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &


8. group by와 order by작업이 가지고 있는 메모리보다 훨씬 클 경우, 정렬 후 row 읽는 것을 빠르게 하기위해 record_buffer값을 증가시켜라
[출처]
my.cnf 설정파일작성자 아진

2009년 9월 17일 목요일

MySQL root 패스워드 분실시 패스워드 변경하는 방법

ps -ef | grep mysqld

killall mysqld

cd /usr/local/mysql/bin/

./safe_mysqld --skip-grant-table &

ps -ef | grep mysqld

./mysql -u root mysql

update user set password=password('h5530186') where user='root';

flush privileges;

exit

killall mysqld

./safe_mysqld &

./mysql -u root -p mysql

root password변경

mysqladmin -p현재패스워드 password변경패스워드

2009년 9월 15일 화요일

“공인인증서도 배달됩니다”

한국정보인증ㆍ우정사업본부 제휴
집배원이 고객 방문ㆍ확인 후 발급

“이제는 집이나 사무실에서 공인인증서를 편리하게 발급 받으세요.”

국내 제1호 공인인증서 발급기관인 한국정보인증(www.sgco.kr)은 지식경제부 우정사업본부와 제휴해 공인인증서를 신청한 고객에게 우체국 집배원이 직접 방문해 대면 확인 후 발급해 주는 ‘공인인증서 방문 발급 서비스’를 14일부터 시작했다.

‘공인인증서 방문 발급 서비스’란 공인인증서 신청 고객이 한국정보인증 홈페이지에서 인증서를 신청할 때 방문 발급 서비스를 선택하면 해피콜 후 우체국 집배원이 직접 고객의 집이나 사무실로 방문해 대면 확인한 후 발급번호를 전달, 인증서를 발급받게 해주는...

자세한 정보는 : http://www.fnn.co.kr/content.asp?aid=4af790c9754844858d94c92efc1440bc

위의 자료를 올린 이유는 다름 아닌 김간의 작품이기 때문... ㅎㅎㅎ

축하해 첫작품 더 많은 기사 나오길 기대할께^^

2009년 9월 1일 화요일

광고는 우리 생활 깊숙이 침투해 있는거 같아 보인다.

그냥 회사 생활하면서 그리고 걸어 다니면서 타고다니면서 생각 해 본 결과 광고라는 건 우리 생활 깊숙이 침투해 있다는 결론을 얻었다.

광고 없이는 뭐든 안되는 그런거?

광고 = PR 은 같다라는 말을 하고 싶고(다 알고 있는 내용이라면 패스)

사이트를 운영하고 싶으면 광고를 걸어라 하고 싶고

내 블로그에 여러가지 광고를 이것저것 달고 싶고

여러가지 광고 기법들 알아보고 싶고

만들어 보고 싶고

표현하고 싶다.

광고를 싫어하면 안된다. 절대...

NHN 야구 경기에 LiveEncoder를 사용하여 온라인 광고를 삽입 하다.

언제부터인가 LiveEncoder라는 놈 때문에 밤을 새고 주말에 나오고 테스트를 밥먹듯이 한적이 있다. 요즘은 조금 나아진 상태 그래두 불안한 맘은 어쩔수가 없다.

하지만 그 노력으로 인해 드디어 많은 사람들에게 모습을 들어 낼때가 되었다.

모습을 들어낸다고 해서 사람들이 아 LiveEcoder구나 하는건 아니다. 단지 실제 방송과 다르게 광고가 나가는 시점에 온라인 광고가 대신해서 나가는 모습을 불수가 있다.
9월 1일 경기부터 시작이 되는데 좋은 결과가 있었으면 한다.