Commit a38fc8d4 authored by Chuck Bell's avatar Chuck Bell

WL#5710 : mysql_plugin - enable or disable plugins

This patch adds a new client utility that enables or disables plugin
features. The utility disables or enables a plugin using values (name,
soname, and symbols) provided via a configuration file by the same name.
For example, to ENABLE the daemon_example plugin, the utility will read
the daemon_example.ini configuration file and use the values contained to
enable or disable the plugin.
parent 704dcf8a
...@@ -54,6 +54,9 @@ ADD_DEPENDENCIES(mysql_upgrade GenFixPrivs) ...@@ -54,6 +54,9 @@ ADD_DEPENDENCIES(mysql_upgrade GenFixPrivs)
MYSQL_ADD_EXECUTABLE(mysqlshow mysqlshow.c) MYSQL_ADD_EXECUTABLE(mysqlshow mysqlshow.c)
TARGET_LINK_LIBRARIES(mysqlshow mysqlclient) TARGET_LINK_LIBRARIES(mysqlshow mysqlclient)
MYSQL_ADD_EXECUTABLE(mysql_plugin mysql_plugin.c)
TARGET_LINK_LIBRARIES(mysql_plugin mysqlclient)
MYSQL_ADD_EXECUTABLE(mysqlbinlog mysqlbinlog.cc) MYSQL_ADD_EXECUTABLE(mysqlbinlog mysqlbinlog.cc)
TARGET_LINK_LIBRARIES(mysqlbinlog mysqlclient) TARGET_LINK_LIBRARIES(mysqlbinlog mysqlclient)
...@@ -69,7 +72,7 @@ IF(WIN32) ...@@ -69,7 +72,7 @@ IF(WIN32)
MYSQL_ADD_EXECUTABLE(echo echo.c) MYSQL_ADD_EXECUTABLE(echo echo.c)
ENDIF(WIN32) ENDIF(WIN32)
SET_TARGET_PROPERTIES (mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysqlslap SET_TARGET_PROPERTIES (mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysqlslap mysql_plugin
PROPERTIES HAS_CXX TRUE) PROPERTIES HAS_CXX TRUE)
ADD_DEFINITIONS(-DHAVE_DLOPEN) ADD_DEFINITIONS(-DHAVE_DLOPEN)
......
This diff is collapsed.
...@@ -603,6 +603,8 @@ typedef SOCKET_SIZE_TYPE size_socket; ...@@ -603,6 +603,8 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define FN_LIBCHAR '\\' #define FN_LIBCHAR '\\'
#define FN_LIBCHAR2 '/' #define FN_LIBCHAR2 '/'
#define FN_DIRSEP "/\\" /* Valid directory separators */ #define FN_DIRSEP "/\\" /* Valid directory separators */
#define FN_EXEEXT ".exe"
#define FN_SOEXT ".dll"
#define FN_ROOTDIR "\\" #define FN_ROOTDIR "\\"
#define FN_DEVCHAR ':' #define FN_DEVCHAR ':'
#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */ #define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */
...@@ -611,6 +613,8 @@ typedef SOCKET_SIZE_TYPE size_socket; ...@@ -611,6 +613,8 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define FN_LIBCHAR '/' #define FN_LIBCHAR '/'
#define FN_LIBCHAR2 '/' #define FN_LIBCHAR2 '/'
#define FN_DIRSEP "/" /* Valid directory separators */ #define FN_DIRSEP "/" /* Valid directory separators */
#define FN_EXEEXT ""
#define FN_SOEXT ".so"
#define FN_ROOTDIR "/" #define FN_ROOTDIR "/"
#endif #endif
......
#
# Plugin initialization file. Format using comma-separated values:
# name, libname, symbol, [symbol, ]
# Note: trailing comma is required.
#
# File is used by mysql_plugin.test for testing missing library error.
#
daemon_example, libdaemon_example, daemon_example,
#
# Plugin initialization file. Format using comma-separated values:
# name, libname, symbol, [symbol, ]
# Note: trailing comma is required.
#
# File is used by mysql_plugin.test for testing bad library name.
#
daemon_BADNAME, libdaemon_example, daemon_example,
...@@ -39,3 +39,4 @@ ha_archive storage/archive ARCHIVE_PLUGIN ...@@ -39,3 +39,4 @@ ha_archive storage/archive ARCHIVE_PLUGIN
ha_blackhole storage/blackhole BLACKHOLE_PLUGIN ha_blackhole storage/blackhole BLACKHOLE_PLUGIN
ha_federated storage/federated FEDERATED_PLUGIN ha_federated storage/federated FEDERATED_PLUGIN
mypluglib plugin/fulltext SIMPLE_PARSER mypluglib plugin/fulltext SIMPLE_PARSER
libdaemon_example plugin/daemon_example DAEMONEXAMPLE
...@@ -168,6 +168,7 @@ my $opt_suites; ...@@ -168,6 +168,7 @@ my $opt_suites;
our $opt_verbose= 0; # Verbose output, enable with --verbose our $opt_verbose= 0; # Verbose output, enable with --verbose
our $exe_mysql; our $exe_mysql;
our $exe_mysql_plugin;
our $exe_mysqladmin; our $exe_mysqladmin;
our $exe_mysqltest; our $exe_mysqltest;
our $exe_libtool; our $exe_libtool;
...@@ -1950,6 +1951,7 @@ sub executable_setup () { ...@@ -1950,6 +1951,7 @@ sub executable_setup () {
# Look for the client binaries # Look for the client binaries
$exe_mysqladmin= mtr_exe_exists("$path_client_bindir/mysqladmin"); $exe_mysqladmin= mtr_exe_exists("$path_client_bindir/mysqladmin");
$exe_mysql= mtr_exe_exists("$path_client_bindir/mysql"); $exe_mysql= mtr_exe_exists("$path_client_bindir/mysql");
$exe_mysql_plugin= mtr_exe_exists("$path_client_bindir/mysql_plugin");
$exe_mysql_embedded= mtr_exe_maybe_exists("$basedir/libmysqld/examples/mysql_embedded"); $exe_mysql_embedded= mtr_exe_maybe_exists("$basedir/libmysqld/examples/mysql_embedded");
...@@ -2357,6 +2359,7 @@ sub environment_setup { ...@@ -2357,6 +2359,7 @@ sub environment_setup {
$ENV{'MYSQLADMIN'}= native_path($exe_mysqladmin); $ENV{'MYSQLADMIN'}= native_path($exe_mysqladmin);
$ENV{'MYSQL_CLIENT_TEST'}= mysql_client_test_arguments(); $ENV{'MYSQL_CLIENT_TEST'}= mysql_client_test_arguments();
$ENV{'EXE_MYSQL'}= $exe_mysql; $ENV{'EXE_MYSQL'}= $exe_mysql;
$ENV{'MYSQL_PLUGIN'}= $exe_mysql_plugin;
$ENV{'MYSQL_EMBEDDED'}= $exe_mysql_embedded; $ENV{'MYSQL_EMBEDDED'}= $exe_mysql_embedded;
# ---------------------------------------------------- # ----------------------------------------------------
......
#
# Ensure the plugin isn't loaded.
#
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
name dl
#
# Enable the plugin...
#
#
# Ensure the plugin is now loaded.
#
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
name dl
daemon_example libdaemon_example.so
#
# Disable the plugin...
#
#
# Ensure the plugin isn't loaded.
#
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
name dl
#
# Attempt to load non-existant plugin
#
ERROR: Cannot read plugin config file NOT_THERE_AT_ALL.ini.
#
# Attempt to use non-existant plugin.ini file
#
ERROR: Cannot read plugin config file daemon_example.ini.
#
# Attempt to omit the plugin
#
ERROR: No plugin specified.
#
# Attempt to omit DISABLE|ENABLE
#
ERROR: missing operation. Please specify either '<plugin> ENABLE' or '<plugin> DISABLE'.
#
# Attempt to use bad paths - datadir
#
ERROR: Cannot access datadir at '/data_not_there/'.
#
# Attempt to use bad paths - basedir
#
ERROR: Cannot access basedir at '/basedir_not_there/'.
#
# Attempt to use bad paths - plugin_dir
#
ERROR: Cannot read plugin config file daemon_example.ini.
#
# Missing library
#
ERROR: The plugin library is missing or in a different location.
#
# Bad format for config file
#
ERROR: plugin name requested does not match config file data.
#
# Missing base_dir option
#
ERROR: Missing --basedir option.
#
# Missing data_dir option
#
ERROR: Missing --datadir option.
#
# Missing plugin_dir option
#
ERROR: Missing --plugin_dir option.
#
# Show the help.
#
mysql_plugin Ver 1.0.0 Distrib XX.XX.XX
Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
Enable or disable plugins.
Usage: mysql_plugin [options] <plugin> ENABLE|DISABLE
Options:
-?, --help Display this help and exit.
-b, --basedir=name The basedir for the server.
-d, --datadir=name The datadir for the server.
-p, --plugin-dir=name
The plugin dir for the server.
-i, --plugin-ini=name
Read plugin information from configuration file specified
instead of from <plugin-dir>/<plugin_name>.ini.
-n, --no-defaults Do not read values from configuration file.
-P, --print-defaults
Show default values from configuration file.
-v, --verbose More verbose output; you can use this multiple times to
get even more verbose output.
-V, --version Output version information and exit.
--plugin-dir=$DAEMONEXAMPLE_DIR
#
# Test mysql_plugin tool
#
#
# Test currently does not run on Windows because in Windows build trees,
# mysqld.exe is not placed in the ./sql folder - it is placed either
# in ./sql/Debug or ./sql/release. If this behaviour is changed, this test
# can run on Windows.
#
--source include/not_windows.inc
# Add the datadir, basedir, plugin_dir to the bootstrap command
let $MYSQLD_DATADIR= `select @@datadir`;
let $MYSQLD_BASEDIR= `select @@basedir`;
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=$DAEMONEXAMPLE_DIR;
--echo #
--echo # Ensure the plugin isn't loaded.
--echo #
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
--echo #
--echo # Enable the plugin...
--echo #
let $expect_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
--write_file $expect_file
wait
EOF
--shutdown_server 10
--source include/wait_until_disconnected.inc
#
# Enable the plugin
#
--exec $MYSQLD_BOOTSTRAP_CMD ENABLE daemon_example
#
# Ensure enabling an enabled plugin doesn't fail
--exec $MYSQLD_BOOTSTRAP_CMD ENABLE daemon_example
#
# Restart the server
#
--append_file $expect_file
restart
EOF
--enable_reconnect
--source include/wait_until_connected_again.inc
--echo #
--echo # Ensure the plugin is now loaded.
--echo #
--replace_regex /\.dll/.so/
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
--echo #
--echo # Disable the plugin...
--echo #
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
--write_file $expect_file
wait
EOF
--shutdown_server 10
--source include/wait_until_disconnected.inc
#
# Disable the plugin
#
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example
#
# Restart the server
#
--append_file $expect_file
restart
EOF
--enable_reconnect
--source include/wait_until_connected_again.inc
--echo #
--echo # Ensure the plugin isn't loaded.
--echo #
SELECT * FROM mysql.plugin WHERE name = 'daemon_example' ORDER BY name;
#
# Stop the server for error conditions
#
let $expect_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect;
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
--write_file $expect_file
wait
EOF
--shutdown_server 10
--source include/wait_until_disconnected.inc
--echo #
--echo # Attempt to load non-existant plugin
--echo #
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE NOT_THERE_AT_ALL 2>&1
--echo #
--echo # Attempt to use non-existant plugin.ini file
--echo #
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example --plugin-ini=/NOT/THERE/pi.ini 2>&1
--echo #
--echo # Attempt to omit the plugin
--echo #
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE 2>&1
--echo #
--echo # Attempt to omit DISABLE|ENABLE
--echo #
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD daemon_example 2>&1
--echo #
--echo # Attempt to use bad paths - datadir
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=/data_not_there/ --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=$DAEMONEXAMPLE_DIR;
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Attempt to use bad paths - basedir
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=/basedir_not_there/ --plugin-dir=$DAEMONEXAMPLE_DIR;
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Attempt to use bad paths - plugin_dir
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=/plugin_not_there/;
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Missing library
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=$MYSQL_TEST_DIR/include/;
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Bad format for config file
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=$DAEMONEXAMPLE_DIR --plugin-ini=$MYSQL_TEST_DIR/include/daemon_example_bad_format.ini;
--error 1,2,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Missing base_dir option
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --plugin-dir=$DAEMONEXAMPLE_DIR;
--error 1,2,139,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Missing data_dir option
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --basedir=$MYSQLD_BASEDIR/sql --plugin-dir=$DAEMONEXAMPLE_DIR;
--error 1,2,139,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Missing plugin_dir option
--echo #
let $MYSQLD_BOOTSTRAP_CMD= $MYSQL_PLUGIN -n --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR/sql;
--error 1,2,139,256
--exec $MYSQLD_BOOTSTRAP_CMD DISABLE daemon_example 2>&1
--echo #
--echo # Show the help.
--echo #
replace_result $MYSQL_PLUGIN mysql_plugin;
--replace_regex /Distrib [0-9.]+/Distrib XX.XX.XX/
--exec $MYSQL_PLUGIN --help
#
# Restart the server
#
--append_file $expect_file
restart
EOF
--enable_reconnect
--source include/wait_until_connected_again.inc
#
# Cleanup
# MTR will remove this file later, but this might be too late.
--error 0,1
--remove_file $expect_file
...@@ -15,3 +15,5 @@ ...@@ -15,3 +15,5 @@
MYSQL_ADD_PLUGIN(daemon_example daemon_example.cc MYSQL_ADD_PLUGIN(daemon_example daemon_example.cc
MODULE_ONLY MODULE_OUTPUT_NAME "libdaemon_example") MODULE_ONLY MODULE_OUTPUT_NAME "libdaemon_example")
INSTALL(FILES daemon_example.ini DESTINATION ${INSTALL_PLUGINDIR})
#
# Plugin initialization file. Format using comma-separated values:
# name, libname, symbol, [symbol, ]
# Note: trailing comma is required.
#
daemon_example, libdaemon_example, daemon_example,
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment