이 페이지는 기계 번역되었습니다. 영어 원본을 읽어보세요. English

IBSurgeon 라이브러리

Firebird 2.5 데이터베이스를 Firebird 3.0으로 빠르게 변환

Basil Sidorov, 02-APR-2019, (c) IBSurgeon

모든 Firebird 버전에는 고유한 데이터베이스 형식인 O(n)D(isk)S(tructure)가 있습니다. 버전 2.5까지는 데이터베이스 엔진이 이전 버전의 ODS로 작업할 수 있지만, Firebird 3 엔진은 자체 ODS(버전 12.0)에서만 작동합니다.

데이터베이스를 Firebird 2.5에서 3.0으로 업그레이드하려면 2.5에서 gbak 도구로 데이터베이스 파일을 백업한 다음 3.0에서 복원해야 합니다.

물론 데이터베이스는 변환을 위해 준비되어야 합니다 - 메타데이터와 쿼리는 Firebird 3.0과의 호환성을 확인해야 하며, Firebird 3에서 복원한 후에는 BLR이 있는 모든 객체(트리거, 저장 프로시저 등)를 다시 컴파일해야 합니다.

표준 접근 방식을 사용한다면 2.5에서 데이터베이스 백업을 만들고, Firebird 3을 설치한 다음 백업 파일을 복원해야 합니다.

시간이 충분하다면 괜찮습니다. 하지만 데이터베이스가 크거나 마이그레이션할 데이터베이스가 수십 개이고 시간이 제한된 경우, 25-30% 더 빠른 스트림 변환을 사용할 수 있습니다.

아이디어는 컨베이어를 사용하는 것입니다:

gbak -b … db25 stdout | gbak -c … stdin db30

2.5의 gbak -b는 백업을 순차적으로 작성하여 stdout 스트림으로 보내고, 3.0의 gbak이 stdin에서 즉시 읽어 새 데이터베이스를 만듭니다.

이 컨베이어는 로컬 데이터베이스 액세스(임베디드)를 사용해야 합니다. 네트워크 전송(로컬호스트라도)은 프로세스를 크게 느리게 만들기 때문입니다.

아래에서는 Windows와 Linux에서 스트림 백업을 수행하는 방법을 살펴봅니다.

Windows

Windows용 특별한 Firebird 파일 세트를 만드는 것이 좋습니다. Firebird 2.5 임베디드 아카이브를 가져와 fbembed.dll을 fbclient.dll로 이름을 바꾸고 gbak.exe와 선택적으로 isql.exe를 추가해야 합니다.

Firebird 3.0의 경우 표준 아카이브를 사용합니다.

(VS2008/VS2010 런타임이 필요하지 않은) 최소 세트에는 다음 파일이 포함됩니다:

Code
25/gbak.exe
25/fbclient.dll
25/firebird.conf
25/firebird.log
25/firebird.msg
25/ib_util.dll
25/icudt30.dll
25/icuin30.dll
25/icuuc30.dll
25/Microsoft.VC80.CRT.manifest
25/msvcp80.dll
25/msvcr80.dll
30/fbclient.dll
30/firebird.conf
30/firebird.msg
30/gbak.exe
30/ib_util.dll
30/icudt52.dll
30/icudt52l.dat
30/icuin52.dll
30/icuuc52.dll
30/msvcp100.dll
30/msvcr100.dll
30/intl/fbintl.conf
30/intl/fbintl.dll
30/plugins/engine12.dll

경험 많은 관리자/개발자는 25/intl/fbintl.dll 및 25/intl/fbintl.conf 파일이 포함되지 않은 것을 알 수 있습니다. 맞습니다. gbak은 연결에 문자 집합을 사용하지 않고 문자 집합 간 데이터 변환을 수행하지 않기 때문입니다. 그러나 수신 측인 Firebird 3.0에서는 인덱스 생성(백업/복원의 마지막 단계) 중에 문자 집합이 사용되므로 icu* 파일이 필요합니다.

Firebird 3 firebird.conf에 두 줄을 추가하는 것이 좋습니다:

Code
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1

또한 Firebird 2.5와 Firebird 3.0에 대해 IpcName 매개변수에 다른 이름을 설정하는 것이 좋습니다.

원하는 경우 데이터베이스 변환 중 Firebird 2.5가 데이터를 읽고 Firebird 3이 데이터를 쓰고 인덱스를 생성한다는 점을 고려하여 다른 매개변수를 변경할 수 있습니다.

인덱스 생성을 빠르게 하려면 TempCacheLimit 매개변수를 사용 가능한 RAM의 약 40%로 늘리는 것이 좋습니다(전용 컴퓨터나 서버인 경우).

예를 들어 RAM이 16GB인 경우 다음을 설정할 수 있습니다:

Code
TempCacheLimit=6G

물론 이 값은 64비트 Firebird 3을 사용하는 경우에만 설정할 수 있습니다. 32비트 프로세스는 2GB 이상의 RAM을 할당할 수 없기 때문입니다.

2.5의 경우 이 매개변수를 변경할 필요가 없습니다. 백업 속도에 영향을 미치지 않으며 Firebird 2.5 자체는 64비트 버전에서도 이 매개변수에 대해 2GB 이상의 RAM을 사용할 수 없기 때문입니다.

또한 시작 전에 데이터베이스 헤더 페이지에서 “page buffers” 값이 0인지 확인하십시오 (gstat -h databasename).

“page buffers” 매개변수가 데이터베이스 헤더에 설정된 경우 firebird.conf 설정을 재정의하며, 큰 값인 경우 엄청난 메모리 소비와 변환 프로세스의 성능 저하를 초래할 수 있습니다.

그런 다음 준비된 파일 세트를 대상 시스템에 복사합니다.

변환 전에 Firebird 2.5의 일반 서비스를 중지해야 합니다.

그런 다음 관리자 권한으로 명령 프롬프트를 시작합니다 (관리자 권한으로 실행):

Code
set ISC_USER=<specify_owner_of_your_database_or_sysdba>
set ISC_PASSWORD=password
"25/gbak" -z -b -g -v -st t -y 25.log db25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin db30

여기서 전체 명령줄은 큰따옴표로 둘러싸여 있고, | 기호는 연결에 사용되며, ^ 기호는 줄 바꿈을 이스케이프하는 데 사용됩니다(긴 명령줄의 경우 유용합니다).

-st(atus) 옵션은 Firebird 2.5.8에서 도입되었으며 백업 프로세스에 대한 더 많은 정보를 로그 파일에 기록할 수 있습니다.

Linux

Linux에서 Firebird 3은 tommath 라이브러리에 의존합니다. CentOS(RHEL)에서는 이 라이브러리가 epel-repository에 있고, Ubuntu(Debian)에서는 시스템 저장소에 있습니다.

CentOS에서는 먼저 EPEL-repository를 활성화한 다음 « yum install libtommath»를 실행해야 합니다.

Ubuntu에서는 추가 저장소를 연결할 필요가 없지만 Ubuntu 16과 Ubuntu 18은 각각 libtommath0 및 libtommath1이라는 다른 패키지 버전을 가지고 있습니다.

Firebird 3은 tommath.so.0을 찾으며, Ubuntu 18의 경우 tommath.so.0에서 tommath.so.1로 심볼릭 링크를 만들어야 합니다. 이렇게 하려면 먼저 tommath.so.1을 찾아야 합니다. Ubuntu의 일반적인 경로는 /usr/lib/x86.64- linux _-gnu/_이지만 다른 Debian 기반 배포판에서는 다를 수 있습니다.

또 다른 문제는 Firebird 3.0.1까지는 2개의 다른 서버 버전을 간단히 설치할 방법이 없었다는 것입니다. “접두사로 소스에서 컴파일” 옵션은 여기서 고려하지 않습니다.

Firebird 3.0.2에는 CORE‑5204 수정 사항이 있습니다: -enable-binreloc으로 빌드(http://tracker.firebirdsql.org/browse/CORE-5204) 및 별도 설치 프로그램 옵션 -path.

따라서 tommath 라이브러리와 필요한 경우 tommath.so.0 심볼릭 링크가 설치된 경우 다음 명령으로 최신 Firebird 3.0.4 배포판을 /opt/fb3에 설치할 수 있습니다: ./install.sh -path /opt/fb3

그 후 기존 Firebird 2.5를 중지하고 스트림 변환을 실행할 수 있습니다.

Firebird 2.5 Classic을 사용하는 경우 Classic은 일반적으로 xinetd로 실행된다는 점을 기억하십시오 - 따라서 xinetd용 firebird 서비스를 비활성화하거나 xinetd를 완전히 중지해야 합니다.

Firebird 3의 firebird.conf에서 MaxUnflushed* 매개변수를 설정할 필요가 없으며(Windows에서만 작동하기 때문에) Firebird 2.5에서 아무것도 변경할 필요가 없습니다.

Linux에서 Firebird 2.5의 임베디드 액세스는 Windows와 다릅니다 - Firebird 2.5는 gbak 프로세스 내에서 작동하지만(네트워킹 부분 없이) 액세스 권한은 사용자 데이터베이스로 확인되므로 데이터베이스 소유자 사용자 이름뿐만 아니라 비밀번호도 지정해야 합니다:

Code
export ISC_USER=username ISC_PASSWORD=password
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30

성공적인 변환 후에는 Firebird 3의 “임시 인스턴스"를 제거하고 원래 2.5를 제거한 다음에만 Firebird 3의 깨끗한 설치를 수행할 수 있습니다.

저장소가 아닌 tar.gz에서 Firebird 3을 설치하는 것이 좋습니다. tar.gz는 편리한 위치인 /opt/ firebird 에 모든 것을 설치하고 저장소의 Firebird 버전은 일반적으로 tar.gz보다 오래되었기 때문입니다.

변환이 완료되고 Firebird 3이 설치된 후 “firebird” 사용자가 데이터베이스 파일의 소유자인지 확인해야 합니다.

그렇지 않은 경우 수정해야 합니다:

Code
chown firebird.firebird databasename

요약

스트림 변환은 중간에 “백업 쓰기” 작업을 건너뛰기 때문에 표준 접근 방식(gbak -b, 그 다음 gbak -c)보다 빠릅니다 - 결과적으로 스트림 변환 시간은 “백업 시간 + 10-15%” + “인덱스 생성 시간” 정도입니다.

우리 경험상 스트림 변환은 전통적인 “순차적” 백업 및 복원보다 최소 25-30% 빠릅니다.

시간 절약과 여유 디스크 공간 요구 감소 외에도 스트림 변환에는 또 다른 장점이 있습니다 - 기존 Firebird 2.5를 제거할 필요가 없어 변환 중 오류가 발생한 경우 빠르게 2.5로 되돌릴 수 있습니다.

연락처

피드백과 문의 사항은 IBSurgeon 지원 팀으로 보내주시기 바랍니다.