태그 Archives: mysql

데이터베이스 마이그레이션

EUC-KR 에서 UTF-8 로 DB마이그레이션을 진행할때 캐릭터셋 전환에 따라 일부 문자가 유실 되거나 깨지게 되어 dump된 파일의 복구가 곤란한 경우가 발생하였다.

sql은 복원중 에러가 발생을 할경우 하위 내용을 복구를 하지 않기 때문에..
이러한 경우 보통 sql 파일을 하나하나 수정해가면서 다시 부어넣는 짓을 해야한다 =_=a

DB용량이 작다면 하나하나 수정해줄수 있지만 100M단위를 넘어가는 파일을 변경하긴 어렵다.
때문에 테이블 생성정보와 데이터를 따로 따로 백업을 하고 먼저 테이블을 생성한뒤에 복구하는 방법을 쓰기로 하고 스크립트를 작성하였다.

 

위와 같이 원본서버에서 백업을 할때 데이터를 분리 한뒤에 iconv를 이용해서 캐릭터셋 치환을 하고 캐릭터셋 선언을 바꾸어 준다.

이중 -c 옵션은 에러가 나는 문자열을 제외하고 치환하는 옵션이다.
가급적 에러가 나지 않는게 좋겠지만 ‘ㅅ’…

 

새로운 데이터 베이스에 먼저 테이블 복원을 한다.

아래와 같은 스크립트작성을 한 뒤에 실행한다.

IFS 를 통해 구분자를 엔터(\n) 으로 지정한뒤 for 문을 돌려 한줄한줄 복원을 시도 하고
에러가나는 구분은 error_query.sql 파일로 별도 저장을 한다.

추후 error_query.sql 파일을 분석하여 쿼리문을 완성 시켜 재 복원을 하거나… 버리거나.. 할수 있겠다.

 

테이블 복원중 VARCHAR(255) UTF8 is too long for key, but max length is 1000 bytes 가 나오는 경우가 발생할수 있다.
key로 사용되는 컬럼의 길이가 1000byte를 넘어가면 안된다는 메세지 이다.
(Mysql에서 UTF8의 경우 문자당 3byte 를 사용한다 – utf8mb4 = 4Byte 를 쓴다..)

이경우 key로 사용되는 컬럼의 varchar 값을 최대치인 333이하를 쓰도록 한다.
일반적으로 2개 이상의 컬럼은 하나의 키로 사용하는 부분에서 에러가 난다. 그때는 사용된 컬럼의 합이 333 이하여야 하겠다.

utf8mb4의 경우에는 200 이하로 해야겠고.. 그래서 대략 아래와 같이… 큰 varchar 컬럼을 앞95자까지 인식하도록 하게 한다.
컬럼A varchar(255)
컬럼B varchar(255)
KEY 키명 (컬럼A(95),컬럼B(95)),

 

php 에서 dbcon 작성 할때 localhost가 안먹을때.

서버에 APM 이 정상 설치가 되어 있으나

php 로 dbcon 을 할때 127.0.0.1은 먹고 localhost 로는 접속이 불가능할때가 있다.

 

먼저 mysql로 로그인을 하여 소켓 위치를 파악하자.

 

php.ini 파일에서 mysql.default_socket 을 일치시켜준다.

 

그다음 아파치나 php-fpm을 재시작 ‘ㅅ’a

Mysql 5.7 에서 sql 복구중 에러.

mysql 5.7 에서 많은 부분이 바뀐거 같다 ‘ㅅ’a

얘를 들어 ‘can\’t’  와 같이 싱글 쿼테이션 안에 존재하는 문자열인 ‘ 의 경우 이스케이프 문자열 \’ 으로 표기하는게 일반적이다.

 

mysql import 과정에서 mysql syntex error 가 발생한다.

공식 메뉴얼에서는 ‘can”t’ 와 같이 실글쿼테이션두개 연속 표기방법으로 바뀌었다.

테스트 해본 결과 “can\’t” 더블 쿼테이션으로 표기를 해도 되는것으로 확인 되었다.

 

또한 mysql.user 테이블의 Password 컬럼의 이름이 authentication_string 으로 변경 되었다.

GRANT 를 이용한 패스워드 지정명령어까지는 삭제 되지 않았으나 추후 삭제된다는 워닝 메세지를 볼수 있다.

차후 GRANT 문이 없어질 경우 DB패스워드 지정은 명령어는 아래와 같다.

ALTER USER user IDENTIFIED BY ‘auth_string’;

 

아래 자세한 메뉴얼 이다.

http://dev.mysql.com/doc/refman/5.7/en/string-literals.html

 

database create 문에서 캐릭터셋 지정하여 생성하기

utf8로 설치된 mysql(mariadb) 에서 euckr용 데이터베이스 생성 >> 생각 보다 쉽다 ‘ㅅ’a

 

변경도 쉽다.

 

1. 일반유저권한의 GRANT
2. root 권한의 user 를 생성하는 GRANT
3. mariadb 에서 원격접속 허용을 위한 GRANT

mysql sleep 자동 킬 스크립트

음 php 프로그래머의 실수에 따라 DB사용을 하지 않으나 장시간 sleep이 나는 경우가 있다.

뭐 프로그램 짜다보면 그럴수 있을것이다 =3=a

서버 관리자 입장에서는 서버 메모리에 부담을 주고 sleep 프로세스의 과다 접속에 의해 my.cnf에서 설정된

max connctions 값 에 의해 추가 신규 접속이 불가능한 상황을 방지 해야 한다.

그리하여 이러한 스크립트를 만들었습니다 🙂

all_user_target 값을 Y로 해두면 모든 계정에 대해 kill을 수행합니다만.

ssh 접속해서 mysql 작업하면서 장시간 가만히 있으면 강제적으로 프로세스 종료 까지 될수 있습니다.

그래서 all_user_target=”N” 으로 하고 문제시 되는 계정만 target_id 에 설정하여 운용하도록 합니다. ‘ㅅ’a