database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Columns 24240 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 24240
mysql upgrade -- 첫번째(준비작업)
작성자
이경환(babocom)
작성일
2005-02-28 15:56:44
조회수
15,665

## 컬럼에다 써야할지 Tutorial 에 써야할지 몰라서 여기다 씁니다..

## 보시고 적당한(?) 게시판에 옮겨주세요.. ㅋㅋ

 

# 이전버전의 mysql 은 /usr/local/mysql-3.23 에 설치되었고 데이타폴더는 그아래 data 폴더에

# 새로 설치하는 mysql 은 /usr/local/mysql-4.0 이고 데이타는 그아래 data 폴더에 있는것으로 가정

 

이긍.. 쓰겠다고 쓰기권한 달라고는 했는데..

막상 쓰려니 글재주도 없고 말주변도 없어서 어떻게 써가야할지 모르겠네요..

 

최근 회사에서 홈페이지 개편을 계획하고 있습니다.

그전까지 mysql 3.23.x 버전을 사용했는데 몇달전 mysql 4.0 버전으로 upgrade 했구요..

이번엔 4.1 버전으로 업그레이드 하려고 계획중입니다.

 

그래서 다른 분들께 도움이 되고자 업그레이드 경과(?) 를 상세히 써보려고 합니다.

 

먼저 3.23 버전에서 4.0 버전으로 업그레이드 한 얘기부터 시작해야겠네요..

[3.23.x -> 4.0.x 변경된 점]

1. 쿼리캐쉬 기능

2. MERGE 테이블에서의 INSERT 가능

3. UNION 쿼리 가능

4. Multiple table DELETE 가능

5. Dynamic Server Variables (셧다운 없이 환경변수 수정 가능)

6. 권한테이블 변경됨 (설치후 mysql_fix_privilege_tables 를 실행해줘야 한다.)

 

php 버전도 오래돼서 이참에 함께 바꾸려고 했습니다.. 다행이 DSO 방식이라 작업시간이 오래 걸리진 않을것 같더군요..

본격적으로 업그레이드하기 이전에 테스트를 해야겠기에 소켓과 포트를 달리주고 새버전의 mysql 을 설치했습니다. 물론 컴파일은 하지 않고 바이너리 배포버전을 사용했습니다.

기설치된 mysql 의 소켓,포트는 일반적으로 /tmp/mysql.sock , 3306 입니다.

작업을 시작하기 전에 새버전의 mysql 을 실행하는데 사용할 mysql2 계정을 만들어 두세요

/sbin/adduser mysql2

 

기존에 /etc/my.cnf 가 있다면 이전버전의 datadir 로 옮겨주시는게 좋습니다.

mysql 이 환경설정 파일을 찾는 순서는 아래와 같습니다.

-----------------------------< 아래 >-------------------------------------------

On Unix, MySQL programs read startup options from the following files:

Filename Purpose
/etc/my.cnf Global options
DATADIR/my.cnf Server-specific options
defaults-extra-file The file specified with --defaults-extra-file=path, if any
~/.my.cnf User-specific options

------------------------------------------------------------------------------

그러므로 /etc/my.cnf 가 있게되면 새로 설치하는 mysql 에서도 이 파일을 읽게 됩니다.

(이하부터 모든 명령은 mysql 설치폴더에서 기준입니다...)

 

일단 /usr/local/mysql-4.0 에 압축을 풀어주고 ./scripts/mysql_install_db 를 실행했더니 이미 권한테이블이 존재한다는 에러가 나더군요...

./scripts/mysql_install_db --basedir=/usr/local/mysql-4.0 이렇게 basedir 을 지정해주셔야 합니다.

./bin/mysqld_safe --user=mysql2 --socket=/tmp/mysql2.sock --port=3308 --basedir=/usr/local/mysql-4.0 --datadir=/usr/local/mysql-4.0/data &

를 실행하여 서버를 띄웁니다.... 성공~!

물론 이렇게 주저리주저리 써줄 필요가 있느냐? my.inf 파일을 쓰면 되지 않느냐 하실텐데..

mysql 서버실행시 옵션파일(my.cnf) 를 찾을때 설치시 지정한 datadir 이 아니라 컴파일시 설정된 datadir 을 찾습니다. (디폴트는 /usr/local/mysql/data 이죠.. 소스컴파일의 경우는 /usr/local/var 입니다.)

그래서 기존 mysql 이 /usr/local/mysql 로 설치되어 있거나 링크되어 있다면 이곳의 datadir 에서 my.cnf 를 읽어버립니다. 그리곤 거기 설정을 주르르 읽게되죠.. ㅡㅡ;;

mysql 실행시 최우선권은 command line option 입니다.. 설정파일에 옵션이 있더라도 command line 에서 준 옵션이 덮어써버게 됩니다.. (왜냐면 환경설정파일을 읽어들인 후에 command line 을 파싱하기 때문이죠.. 자세한건 mysql document 를 보시길... )

그래서 혹시라도 my.cnf 에서 기설정된 변수값의 영향이 있을지 모르기에 이렇듯 좌악 써주시는 것이 안전하다는 겁니다.. 기설정된 mysql 과 충돌을 일으키지 않구요..

데몬을 띄운후 ps -aux 하셔서 mysql2 의 [mysqld] 데몬이 있으면 정상적으로 실행된 겁니다.

참고로 실수로 --user=mysql 이라고 하셨을 경우 기존서버와의 충돌로 에러를 내며 종료합니다..

이경우 /tmp/mysql.sock (그전서버의 소켓파일) 을 삭제해버리는 수가 있습니다.(소유자가 mysql)

/tmp 폴더는 sticky bit 가 설정된 특수폴더로 누구나 파일을 생성할 순 있지만 파일의 소유자만이 해당 파일을 삭제할 수 있습니다. 기존 mysql.sock 의 소유자가 mysql 일테니 서버가 다운되면서 삭제해 버리게 되죠.. 그렇게 되면 그전 서버는 실행되더라도 소켓파일이 없어 접속할 수 없는 사태가 발생하죠..

이런 경우 그전서버를 내리셨다 다시 올리시면 mysql 은 시작시 소켓파일을 생성하므로 다시 정상운영 하실수 있습니다.. (저도 첨에 이런경우 많이 당했습니다.. )

그래서 테스트시에는 소켓파일과 유저명을 달리 하시는 것이 좋습니다.

(정상적으로 설치,실행되었다면 /tmp/mysql2.sock 파일이 mysql2 의 소유로 생성되었을 겁니다.)

작업도중 갑자기 기존서버에 접속이 안되면 /tmp/mysql.sock 이 있는지 확인해 보세요...

 

물론 3.23 의 mysql 테이블을 사용할수도 있습니다.. 그대로 복사해주고 소유자만 바꿔주면 되죠..

그리고 ./bin/mysql_fix_privilege_tables 스크립트를 실행하면 됩니다.

그런데 이 스크립트는 mysql 서버가 실행된 상태에서 사용해야 하므로.. 일단 서버를 실행시킵니다.

그리고 ./bin/mysql_fix_privilege_tables --socket=/tmp/mysql2.sock -uroot -p 로 실행..

만약 실행이 안될때는 vi 로 mysql_fix_privilege_tables 스크립트를 열어보시면 상단에 유저,패스워드,소켓 등등을 입력할 수 있는 부분이 있으니 그곳을 알맞게 수정해 주시고 실행하면 됩니다.

 

새로운 서버를 실행하는데 성공하셨다면 /tmp/mysql2.sock 파일이 생겼는지 확인해 보세요..

그리고 접속을 테스트 해봅시다..

./bin/mysql --socket=/tmp/mysql2.sock -uroot 이러면 새로운 서버에 접속이 됩니다.

status 명령으로 버전을 확인해 보시고 mysql 권한테이블도 확인해 보세요.. 이전에 없던 몇개의 테이블이 추가되었습니다... tables_priv, columns_priv 등등.. 또 필드도 몇개 추가됐구영..

 

서버를 중지시키는데 pid 파일을 찾을수 없다는 에러가 나는 경우가 있습니다.

저의경우 서버중지시 ./support_files/mysql.server stop 명령을 주로 이용하는데..

( 전 보통 서버실행시는 ./bin/mysqld_safe & 를 이용하고 중지시는 ./support_files/mysql.server stop 을 이용합니다.. 특이한건지.. ^^;;;)

이 스크립트가 --basedir --datadir 옵션을 줘도 제대로 반영이 안되는 경우가 많더라구요..

--------------------< mysql.server >------------------------------

# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
# [mysqld]
# basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
# and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
# below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.

basedir=

# The following variables are only set for letting mysql.server find things.

# Set some defaults
datadir= <-- 이부분에 mysql 의 datadir 경로를 지정해주면 됩니다.

pid_file=
if test -z "$basedir"
then
basedir=/usr/local/mysql
bindir=./bin
else
bindir="$basedir/bin"
fi

-------------------------------------------------------------------

mysql 은 시작시에 소켓파일을 생성하고 datadir 에 hostname.pid 파일에다 자신의 pid 를 기록해둡니다. 혹시 서버가 정지되지 않으면 먼저 mysqld_safe 스크립트를 죽이시고 그담에 pid 파일에 기록된 pid 번호의 mysqld 데몬을 죽이면 됩니다..

왜 mysqld_safe 를 먼저 죽일까요??

mysqld_safe 이넘은 명령행 옵션을 파싱해서 mysqld 데몬을 실행시키는것 외에도 while 루프로 계속 실행되면서 mysqld 데몬이 죽으면 다시 실행시키는 역할도 합니다. 그래서 이넘이 있으면 데몬을 죽여도 계속 실행됩니다.. ㅋㅋ

 

이제 새로 설치한 mysql 의 시작과 종료에 이상이 없다면 이제 두 버전을 모두 실행시키고 DB 를 이전하도록 하죠..

아참... php 에서 새로운 mysql 을 사용하기 위해서는 mysql_connect 시에 hostname 을 localhost 를 쓰지 말고 소켓을 직접 지정해주면 가능합니다... (php 3.0.10 이후부터 가능..)

$db_conn = mysql_connect(":/tmp/mysql2.sock","root","password");

새버전 mysql 과 접속,사용에 이상이 없는지 확인해 보시고 정상적이라면 이제 DB 를 옮길 준비를 해야죠..

 

관리자에게 있어 단 몇분이라도 서버가 중지된다는 것은 치명적인 오점이 됩니다.

가급적 서버다운시간을 줄이기 위해 다음과 같이 DB 이전 계획을 세웁니다..

apache stop > mysql stop > DB 이전 > mysql 재시작 > php 컴파일, Zend 설치 > apache start

예상시간은 5분 ~ 10분 정도...

작업을 하기 전에 모든 명령어와 작업순서를 숙지하시고 가급적 메모하여 모니터옆에 두시기 바랍니다.

또한 이전작업중 발생할 수 있는 문제점과 해결방법도 미리미리 준비하여 두시기 바랍니다.

(현재시점에서 마지막 백업을 작성해 두시고 혹시 있을수도 있는 불상사를 대비해서 apache 와 php 그리고 Zend 소스를 업로드해 두시기 바랍니다.)

현재 php 컴파일 옵션은 php_info() 를 출력해 보시면 아실 수 있습니다.

가급적 현재의 php_info 를 출력해두거나 세이브해 두시기 바랍니다.. apache 와 php 를 DSO 방식으로 설치했다면 apache 는 재컴파일할 필요가 없으니 가능한 php 를 DSO 방식으로 설치하는 것이 업그레이드에 있어 수월합니다...

apache 와 php 를 compiled in 방식으로 설치하셨다면...

apache stop > mysql stop > DB 이전 > mysql 재시작 > php 컴파일, Zend 설치> apache 컴파일 > apache start 의 순서가 되겠죠...

 

DB 이전 작업과 관련된 내용은 두번째 이야기로 넘어가도록 하죠.. ^^;;

[Top]
No.
제목
작성자
작성일
조회
24452APM 에서 UTF-8 사용하기. [3]
백록화
2005-09-24
23080
24242mysql upgrade -- 세번째(4.1버전) [7]
이경환
2005-03-04
25828
24241mysql upgrade -- 두번째(DB이전) [1]
이경환
2005-03-02
15808
24240mysql upgrade -- 첫번째(준비작업)
이경환
2005-02-28
15665
242314.0 에 매치되는 4.1 글자셋 [1]
이경환
2005-08-12
11946
24199MySQL - Explain 정보보는법
이경환
2005-04-06
34343
239194.1 이전 버전에서의 한글검색 문제 [1]
이경환
2005-06-13
10628
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2017 DSN, All rights reserved.
작업시간: 0.119초, 이곳 서비스는
	PostgreSQL v9.6.3으로 자료를 관리합니다