24.4.2.5 사용자 정의 함수의 컴파일 및 설치
UDF를 구현하는 파일 서버가 실행되는 호스트에서 컴파일 및 설치해야합니다. MySQL 소스 배포판에 포함되어있는 UDF 파일의 예 sql/udf_example.cc
을 사용하여이 프로세스에 대해 설명합니다.
슬레이브 서버에 복제되는 문 UDF가 참조되는 경우, 모든 슬레이브에서 함수를 사용할 수 있어야합니다. 그렇지 않으면, 슬레이브에서 그 함수를 호출하려고 할 때 복제가 슬레이브로 실패합니다.
다음 단계는 Unix의 경우입니다. Windows에서의 절차는이 섹션의 나머지에서 설명합니다.
udf_example.cc
파일은 다음의 함수가 포함되어 있습니다.
metaphon()
는 문자열 인수의 metaphon 문자열을 반환합니다. 이것은 soundex 문자열과 비슷하지만, 영어 전용으로 조정되어 있습니다.myfunc_double()
는 인수의 문자의 ASCII 값의 합계를 그 인수의 길이의 합으로 나눈 값을 반환합니다.myfunc_int()
는 인수의 길이의 합계를 반환합니다.sequence([const int])
는 지정된 숫자 또는 1 (값이 지정되지 않은 경우)에서 시작 순서를 돌려줍니다.lookup()
는 호스트 이름의 IP 주소를 돌려줍니다.reverse_lookup()
는 IP 주소에 대한 호스트 이름을 반환합니다. 이 함수는'xxx.xxx.xxx.xxx'
형태의 단일 문자열 인수 또는 4 개의 숫자 중 하나를 사용하여 호출 할 수 있습니다.avgcost()
는 평균 비용을 반환합니다. 이것은 집계 함수입니다.
동적으로로드 가능한 파일은 다음과 같은 명령을 사용하여 공유 가능한 오브젝트 파일로 컴파일합니다.
shell> gcc -shared -o udf_example.so udf_example.cc
CMake에 gcc를 사용하는 경우 (MySQL은 그렇게 구성되어 있습니다) 더 간단한 명령 udf_example.so
을 만들 수 있습니다.
shell> make udf_example
UDF가 포함되어있는 공유 객체를 컴파일 한 후 공유 객체를 설치하여 MySQL에 통지해야합니다. gcc를 사용하여 udf_example.cc
에서 공유 객체를 컴파일하면 udf_example.so
라는 파일을 직접 생성됩니다. 공유 객체를 서버 플러그인 디렉토리에 복사하고 udf_example.so
이름을 지정합니다. 이 디렉토리는 plugin_dir
시스템 변수의 값을 얻을 수 있습니다.
일부 시스템에서는 동적 링커를 구성하는 ldconfig 프로그램은 공유 객체의 이름이 lib
로 시작되지 않으면 공유 오브젝트를 인식하지 않습니다. 이 경우, 예를 들어, 파일 이름을 udf_example.so
에서 libudf_example.so
이름 변경하십시오.
Windows에서 다음 단계를 사용하여 사용자 정의 함수를 컴파일 할 수 있습니다.
MySQL 소스 배포판을 가져옵니다. 섹션 2.1.3 "MySQL를 얻는 방법" 을 참조하십시오.
필요한 경우 CMake 빌드 유틸리티를 http://www.cmake.org 에서 가져옵니다. (버전 2.6 이상이 필요합니다).
소스 트리에서
sql
디렉토리를 참조합니다. 그 곳에는udf_example.def
udf_example.cc
라는 파일이 있습니다. 두 파일을이 디렉토리에서 작업 디렉토리에 복사합니다.다음 내용을 가지는 CMake의
makefile
(CMakeLists.txt
)을 만듭니다.PROJECT(udf_example) # Path for MySQL include directory INCLUDE_DIRECTORIES("c:/mysql/include") ADD_DEFINITIONS("-DHAVE_DLOPEN") ADD_LIBRARY(udf_example MODULE udf_example.cc udf_example.def) TARGET_LINK_LIBRARIES(udf_example wsock32)
VC 프로젝트 파일 및 솔루션 파일을 만듭니다.
cmake -G "<Generator>"
cmake --help를 호출하면 유효한 발전기의 목록이 표시됩니다.
udf_example.dll
을 만듭니다.devenv udf_example.sln /build Release
공유 객체 파일이 설치되면 다음 문을 사용하여 새로운 함수에 대해 mysqld 통지합니다. 사용하는 시스템 객체 파일의 접미사가 .so
가 아닌 경우 올바른 접미사에 모든 대체합니다 (예를 들어, Windows의 경우 .dll
).
mysql>CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so';
mysql>CREATE FUNCTION myfunc_double RETURNS REAL SONAME 'udf_example.so';
mysql>CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME 'udf_example.so';
mysql>CREATE FUNCTION sequence RETURNS INTEGER SONAME 'udf_example.so';
mysql>CREATE FUNCTION lookup RETURNS STRING SONAME 'udf_example.so';
mysql>CREATE FUNCTION reverse_lookup
->RETURNS STRING SONAME 'udf_example.so';
mysql>CREATE AGGREGATE FUNCTION avgcost
->RETURNS REAL SONAME 'udf_example.so';
함수를 삭제하려면 DROP FUNCTION
을 사용합니다.
mysql>DROP FUNCTION metaphon;
mysql>DROP FUNCTION myfunc_double;
mysql>DROP FUNCTION myfunc_int;
mysql>DROP FUNCTION sequence;
mysql>DROP FUNCTION lookup;
mysql>DROP FUNCTION reverse_lookup;
mysql>DROP FUNCTION avgcost;
CREATE FUNCTION
문 및 DROP FUNCTION
문은 mysql
데이터베이스 func
시스템 테이블을 업데이트합니다. 함수의 이름, 형태, 및 공유 라이브러리 이름은 테이블에 저장됩니다. 함수를 작성하거나 삭제하려면 mysql
데이터베이스 INSERT
권한 또는 DELETE
권한을 각각 가지고 있어야합니다.
이미 생성 된 함수를 CREATE FUNCTION
을 사용하여 추가하지 마십시오. 함수를 다시 설치해야하는 경우 DROP FUNCTION
을 사용하여 함수를 제거하고, CREATE FUNCTION
을 사용하여 다시 설치해야합니다. 이렇게해야하는 것은, 예를 들어, mysqld가 함수의 새 버전을 얻을 수 있도록 새로운 버전을 다시 컴파일하는 경우입니다. 그렇지 않으면 서버는 이전 버전을 사용하고 있습니다.
활성 함수는 CREATE FUNCTION
을 사용하여로드되고 있고, DROP FUNCTION
을 사용하여 삭제되지 않은 함수입니다. 모든 활성 함수는 서버가 시작할 때마다 다시로드됩니다 만, --skip-grant-tables
옵션을 지정해 mysqld를 시작하면 다릅니다. 이 경우, UDF 초기화가 생략되고 UDF는 사용할 수 없습니다.