Merge work.mysql.com:/home/bk/mysql
into threads.polyesthetic.msg:/usr/local/src/my/work
This commit is contained in:
commit
ea0a749132
118
Docs/manual.texi
118
Docs/manual.texi
@ -5364,6 +5364,12 @@ into it.
|
|||||||
Obtain a distribution file from one of the sites listed in
|
Obtain a distribution file from one of the sites listed in
|
||||||
@ref{Getting MySQL, , Getting @strong{MySQL}}.
|
@ref{Getting MySQL, , Getting @strong{MySQL}}.
|
||||||
|
|
||||||
|
@item
|
||||||
|
If you are interested in using Berkeley DB tables with MySQL, you
|
||||||
|
will need to obtain a patched version of the Berkeley DB source
|
||||||
|
code. Please read the chapter on Berkeley DB tables before
|
||||||
|
proceeding. @xref{BDB}.
|
||||||
|
|
||||||
@strong{MySQL} source distributions are provided as compressed @code{tar}
|
@strong{MySQL} source distributions are provided as compressed @code{tar}
|
||||||
archives and have names like @file{mysql-VERSION.tar.gz}, where
|
archives and have names like @file{mysql-VERSION.tar.gz}, where
|
||||||
@code{VERSION} is a number like @value{mysql_version}.
|
@code{VERSION} is a number like @value{mysql_version}.
|
||||||
@ -5708,32 +5714,31 @@ source tree:
|
|||||||
|
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
Download @strong{BitKeeper} from @uref{http://www.bitmover.com/cgi-bin/download.cgi}
|
Download @strong{BitKeeper} from @uref{http://www.bitmover.com/cgi-bin/download.cgi}.
|
||||||
@item
|
@item
|
||||||
Follow the instructions to install it
|
Follow the instructions to install it.
|
||||||
@item
|
@item
|
||||||
Once @strong{BitKeeper} is installed,
|
Once @strong{BitKeeper} is installed,
|
||||||
@code{bk clone bk://work.mysql.com:7000 mysql} - the initial download
|
@code{bk clone bk://work.mysql.com:7000 mysql} - the initial download
|
||||||
may take a while, depending on the speed of your connection
|
may take a while, depending on the speed of your connection.
|
||||||
@item
|
@item
|
||||||
@code{cd mysql; bk -r edit; aclocal; autoheader; autoconf;
|
@code{cd mysql; bk -r edit; aclocal; autoheader; autoconf;
|
||||||
automake; ./configure} with your favorite options, and then
|
automake; ./configure} with your favorite options, and then
|
||||||
@code{ make}
|
@code{ make}.
|
||||||
- you will need GNU autoconf/automake, libtool, and m4 to do this.
|
You will need GNU autoconf/automake, libtool, and m4 to do this.
|
||||||
. We have a
|
We have a
|
||||||
collection of our standard configure scripts in the @code{BUILD/}
|
collection of our standard configure scripts in the @code{BUILD/}
|
||||||
subdirectory - if you are lazy, you can do
|
subdirectory - if you are lazy, you can do
|
||||||
@code{BUILD/compile-pentium-debug} . It will actually work on a lot of
|
@code{BUILD/compile-pentium-debug} . It will actually work on a lot of
|
||||||
none-x86 machines despite its name.
|
non-x86 machines despite its name.
|
||||||
@item
|
@item
|
||||||
Once the build is done, @code{make install}. Be careful with this on
|
Once the build is done, @code{make install}. Be careful with this on
|
||||||
a production machine - this may overwrite your live release binary. We
|
a production machine - this may overwrite your live release binary. We
|
||||||
recommend that if you have another installation of @strong{MySQL} that
|
recommend that if you have another installation of @strong{MySQL} that
|
||||||
you @code{./configure} with different values for @code{basedir},
|
you @code{./configure} with different values for @code{prefix},
|
||||||
@code{datadir}, @code{bindir}, @code{sbindir}, @code{libexecdir},
|
@code{tcp-port}, and @code{unix-socket-path}.
|
||||||
@code{tcp-port}, and @code{unix-socket-path}
|
|
||||||
@item
|
@item
|
||||||
Play hard with your new installation and try to make the new feature
|
Play hard with your new installation and try to make the new features
|
||||||
crash. Report bugs to @email{bugs@@lists.mysql.com}. As always, make
|
crash. Report bugs to @email{bugs@@lists.mysql.com}. As always, make
|
||||||
sure you have a full test case for the bug that we can run.
|
sure you have a full test case for the bug that we can run.
|
||||||
@item
|
@item
|
||||||
@ -5745,18 +5750,18 @@ if you execute @code{aclocal} and get @code{command not found}, or a
|
|||||||
similar problem, do not report it - make sure all the needed tools are
|
similar problem, do not report it - make sure all the needed tools are
|
||||||
installed and your @code{PATH} variable is set correctly.
|
installed and your @code{PATH} variable is set correctly.
|
||||||
@item
|
@item
|
||||||
After the initial @code{bk clone}, do @code{bk pull} to get the updates
|
After the initial @code{bk clone}, do @code{bk pull} to get the updates.
|
||||||
@item
|
@item
|
||||||
You can examine change history to the tree with all the cool diffs with
|
You can examine change history of the tree with all the diffs with
|
||||||
@code{bk sccstool}. If you see some funny diffs or code that you have a
|
@code{bk sccstool}. If you see some funny diffs or code that you have a
|
||||||
question about, do not hesitate and e-mail
|
question about, do not hesitate and e-mail
|
||||||
@email{internals@@lists.mysql.com}. Also if you think you have a
|
@email{internals@@lists.mysql.com}. Also if you think you have a
|
||||||
better idea on how to do something, send an email to the same place
|
better idea on how to do something, send an email to the same place
|
||||||
with a patch - @code{bk diffs} with produce a patch for you after you
|
with a patch - @code{bk diffs} will produce a patch for you after you
|
||||||
have made changes to the source. If you do not have the time to code
|
have made changes to the source. If you do not have the time to code
|
||||||
your idea, just send a description.
|
your idea, just send a description.
|
||||||
@item
|
@item
|
||||||
@strong{BitKeeper} has a nice help utility - @code{bk helptool}
|
@strong{BitKeeper} has a nice help utility - @code{bk helptool}.
|
||||||
|
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@ -5989,7 +5994,7 @@ Note that on Linux you should NOT use MIT-pthreads but install LinuxThreads!
|
|||||||
|
|
||||||
If your system does not provide native thread support, you will need to
|
If your system does not provide native thread support, you will need to
|
||||||
build @strong{MySQL} using the MIT-pthreads package. This includes
|
build @strong{MySQL} using the MIT-pthreads package. This includes
|
||||||
most FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others.
|
older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others.
|
||||||
@xref{Which OS}.
|
@xref{Which OS}.
|
||||||
|
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@ -22230,40 +22235,49 @@ Berkeley DB (@uref{http://www.sleepycat.com}) has provided
|
|||||||
crashes and also provides @code{COMMIT} and @code{ROLLBACK} on
|
crashes and also provides @code{COMMIT} and @code{ROLLBACK} on
|
||||||
transactions. In order to build MySQL Version 3.23.x (BDB support first
|
transactions. In order to build MySQL Version 3.23.x (BDB support first
|
||||||
appeared in Version 3.23.15) with support for @code{BDB} tables, you
|
appeared in Version 3.23.15) with support for @code{BDB} tables, you
|
||||||
will need Berkeley DB Version 3.1.14 or newer which can be downloaded from
|
will need Berkeley DB Version 3.2.3d or newer which can be downloaded from
|
||||||
@uref{http://www.mysql.com/downloads/mysql-3.23.html}; or also from
|
@uref{http://www.mysql.com/downloads/mysql-3.23.html}. This is a patched
|
||||||
Sleepycat's download page at
|
version of Berkeley DB that is only available from @strong{MySQL}; the
|
||||||
@uref{http://www.sleepycat.com/download.html}.
|
standard Berkeley DB @strong{will not work with MySQL}.
|
||||||
|
|
||||||
@node BDB install, BDB start, BDB overview, BDB
|
@node BDB install, BDB start, BDB overview, BDB
|
||||||
@subsection Installing BDB
|
@subsection Installing BDB
|
||||||
|
|
||||||
To install Berkeley DB, first uncompress the @code{BDB} distribution
|
If you have downloaded a binary version of @strong{MySQL} that includes
|
||||||
and follow the instructions in the README file provided in the distribution
|
support for Berkeley DB, simply follow the instructions for
|
||||||
directory. Basically what you need to do is:
|
installing a binary version of @strong{MySQL}. @xref{Installing binary}.
|
||||||
|
|
||||||
|
To compile MySQL with Berkeley DB support, first uncompress the
|
||||||
|
@code{BDB} distribution into the @strong{MySQL} top-level source
|
||||||
|
directory, and follow the instructions for building MySQL from
|
||||||
|
source. Configure will automatically detect and use the Berkeley
|
||||||
|
DB source you just uncompressed. @xref{Installing source}.
|
||||||
|
|
||||||
@example
|
@example
|
||||||
cd build_[your_os]
|
cd /path/to/source/of/mysql-3.23.29-gamma
|
||||||
../dist/configure
|
gzip -cd /tmp/db-3.2.3d.tar.gz | tar xf -
|
||||||
make
|
./configure # this will use Berkeley DB automatically
|
||||||
make install
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Please refer to the manual provided by @code{BDB} distribution for
|
If you would like to install Berkeley DB separately, to use with
|
||||||
more/updated information.
|
other applications and MySQL, this is possible. Follow the directions
|
||||||
|
for installing Berkeley DB in the Berkeley DB README file. Then, pass
|
||||||
After this you need to configure your @strong{MySQL} with
|
the @code{--with-berkeley-db=DIR} option to @code{MySQL}'s @code{configure},
|
||||||
@code{--with-berkeley-db=DIR}. The directory is the one where you installed
|
where @code{DIR} refers to the installation prefix used when installing
|
||||||
@code{BDB} binaries with @code{make install}. (Usually it is
|
Berkeley DB (by default it is
|
||||||
/usr/local/BerkeleyDB.3.1/.) You can give additional options to
|
/usr/local/BerkeleyDB.3.2). You can give additional options to
|
||||||
@strong{MySQL} configure, @code{--with-berkeley-db-includes=DIR} and
|
@strong{MySQL} configure, @code{--with-berkeley-db-includes=DIR} and
|
||||||
@code{--with-berkeley-db-libs=DIR}, if the @code{BDB} includes and/or libs
|
@code{--with-berkeley-db-libs=DIR}, if the @code{BDB} includes and/or libs
|
||||||
directory is not under the first directory (by default they are).
|
directory is not under the first directory (by default they are).
|
||||||
Then complete the @strong{MySQL} installation as normal.
|
Then complete the @strong{MySQL} installation as normal.
|
||||||
|
|
||||||
Even if Berkeley DB is in itself very tested and reliable, the
|
Please refer to the manual provided by @code{BDB} distribution for
|
||||||
@strong{MySQL} interface is still very alpha, but we are actively
|
more/updated information.
|
||||||
improving and optimizing it to get it this stable real soon.
|
|
||||||
|
Even though Berkeley DB is in itself very tested and reliable,
|
||||||
|
the @strong{MySQL} interface is still considered beta quality.
|
||||||
|
We are actively improving and optimizing it to get it stable very
|
||||||
|
soon.
|
||||||
|
|
||||||
@node BDB start, BDB characteristic, BDB install, BDB
|
@node BDB start, BDB characteristic, BDB install, BDB
|
||||||
@subsection BDB startup options
|
@subsection BDB startup options
|
||||||
@ -22272,6 +22286,12 @@ If you are running with @code{AUTOCOMMIT=0} then your changes in @code{BDB}
|
|||||||
tables will not be updated until you execute @code{COMMIT}. Instead of commit
|
tables will not be updated until you execute @code{COMMIT}. Instead of commit
|
||||||
you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}.
|
you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}.
|
||||||
|
|
||||||
|
If you are running with @code{AUTOCOMMIT=1} (the default), your changes
|
||||||
|
will be committed immediately. You can start an extended transaction with
|
||||||
|
the @code{BEGIN WORK} SQL command, after which your changes will not be
|
||||||
|
committed until you execute @code{COMMIT} (or decide to @code{ROLLBACK}
|
||||||
|
the changes).
|
||||||
|
|
||||||
The following options to @code{mysqld} can be used to change the behavior of
|
The following options to @code{mysqld} can be used to change the behavior of
|
||||||
BDB tables:
|
BDB tables:
|
||||||
|
|
||||||
@ -22284,6 +22304,7 @@ BDB tables:
|
|||||||
@item @code{--bdb-recover} @tab Start Berkeley DB in recover mode.
|
@item @code{--bdb-recover} @tab Start Berkeley DB in recover mode.
|
||||||
@item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name.
|
@item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name.
|
||||||
@item @code{--skip-bdb} @tab Don't use berkeley db.
|
@item @code{--skip-bdb} @tab Don't use berkeley db.
|
||||||
|
@item @code{-O bdb_lock_max=1000} @tab Set the maximum number of locks possible. @xref{SHOW VARIABLES}.
|
||||||
@end multitable
|
@end multitable
|
||||||
|
|
||||||
If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the
|
If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the
|
||||||
@ -22336,15 +22357,16 @@ read may fail with a deadlock error.
|
|||||||
@item
|
@item
|
||||||
Keys are not compressed to previous keys as with ISAM or MyISAM
|
Keys are not compressed to previous keys as with ISAM or MyISAM
|
||||||
tables. In other words, the key information will take a little more
|
tables. In other words, the key information will take a little more
|
||||||
space in @code{BDB} tables compared to MyISAM tables with don't use
|
space in @code{BDB} tables compared to MyISAM tables which don't use
|
||||||
@code{PACK_KEYS=0}.
|
@code{PACK_KEYS=0}.
|
||||||
@item
|
@item
|
||||||
One must do a @code{FLUSH LOGS} from time to time to sync to get checkpoints
|
@strong{MySQL} performs a checkpoint each time a new Berkeley DB log
|
||||||
for the @code{BDB} tables.
|
file is started, and removes any log files that are not needed for
|
||||||
@item
|
current transactions. One can also run @code{FLUSH LOGS} at any time
|
||||||
As transaction logs take up more space than ordinary logs, it's more important
|
to checkpoint the Berkeley DB tables.
|
||||||
to rotate and remove old logs when using @code{BDB} tables than when using other table
|
|
||||||
types.
|
For disaster recovery, one should use table backups plus MySQL's binary
|
||||||
|
log. @xref{Backup}.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
@node BDB TODO, BDB errors, BDB characteristic, BDB
|
@node BDB TODO, BDB errors, BDB characteristic, BDB
|
||||||
@ -22370,8 +22392,9 @@ error file:
|
|||||||
001119 23:43:56 bdb: txn_abort: Log undo failed for LSN: 1 3644744: Invalid
|
001119 23:43:56 bdb: txn_abort: Log undo failed for LSN: 1 3644744: Invalid
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
This is not fatal but we don't recommend you to delete tables you are
|
This is not fatal but we don't recommend that you delete tables if you are
|
||||||
using in not @code{auto_commit} mode.
|
not in @code{auto_commit} mode, until this problem is fixed (the fix is
|
||||||
|
not trivial).
|
||||||
|
|
||||||
@cindex tutorial
|
@cindex tutorial
|
||||||
@cindex terminal monitor, defined
|
@cindex terminal monitor, defined
|
||||||
@ -38906,6 +38929,9 @@ though, so Version 3.23 is not released as a stable version yet.
|
|||||||
@appendixsubsec Changes in release 3.23.29
|
@appendixsubsec Changes in release 3.23.29
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
|
Automatically remove Berkeley DB transaction logs that are no longer in
|
||||||
|
use.
|
||||||
|
@item
|
||||||
Applied patches for OS2 by @code{Yuri Dario}.
|
Applied patches for OS2 by @code{Yuri Dario}.
|
||||||
@item
|
@item
|
||||||
@code{FLUSH TABLES table_name} didn't always flush table properly to
|
@code{FLUSH TABLES table_name} didn't always flush table properly to
|
||||||
|
@ -615,7 +615,8 @@ dnl ---------------------------------------------------------------------------
|
|||||||
AC_DEFUN([MYSQL_CHECK_BDB], [
|
AC_DEFUN([MYSQL_CHECK_BDB], [
|
||||||
AC_ARG_WITH([berkeley-db],
|
AC_ARG_WITH([berkeley-db],
|
||||||
[\
|
[\
|
||||||
--with-berkely-db[=DIR] Use BerkeleyDB located in DIR],
|
--with-berkeley-db[=DIR]
|
||||||
|
Use BerkeleyDB located in DIR],
|
||||||
[bdb="$withval"],
|
[bdb="$withval"],
|
||||||
[bdb=default])
|
[bdb=default])
|
||||||
|
|
||||||
|
@ -1821,7 +1821,12 @@ then
|
|||||||
sql_server_dirs="$have_berkeley_db/build_unix $sql_server_dirs"
|
sql_server_dirs="$have_berkeley_db/build_unix $sql_server_dirs"
|
||||||
|
|
||||||
echo "CONFIGURING FOR BERKELEY DB"
|
echo "CONFIGURING FOR BERKELEY DB"
|
||||||
(cd $bdb && cd build_unix && sh ../dist/configure) \
|
bdb_conf_flags=
|
||||||
|
if test $with_debug = "yes"
|
||||||
|
then
|
||||||
|
bdb_conf_flags="$bdb_conf_flags --enable-debug --enable-diagnostic"
|
||||||
|
fi
|
||||||
|
(cd $bdb && cd build_unix && sh ../dist/configure $bdb_conf_flags) \
|
||||||
|| AC_MSG_ERROR([could not configure Berkeley DB])
|
|| AC_MSG_ERROR([could not configure Berkeley DB])
|
||||||
|
|
||||||
echo "Modifying Berkeley DB install target"
|
echo "Modifying Berkeley DB install target"
|
||||||
|
@ -42,7 +42,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
|||||||
item_strfunc.h item_timefunc.h item_uniq.h \
|
item_strfunc.h item_timefunc.h item_uniq.h \
|
||||||
item_create.h mysql_priv.h \
|
item_create.h mysql_priv.h \
|
||||||
procedure.h sql_class.h sql_lex.h sql_list.h \
|
procedure.h sql_class.h sql_lex.h sql_list.h \
|
||||||
sql_map.h sql_string.h unireg.h \
|
sql_manager.h sql_map.h sql_string.h unireg.h \
|
||||||
field.h handler.h ha_isammrg.h ha_isam.h ha_myisammrg.h\
|
field.h handler.h ha_isammrg.h ha_isam.h ha_myisammrg.h\
|
||||||
ha_heap.h ha_myisam.h ha_berkeley.h\
|
ha_heap.h ha_myisam.h ha_berkeley.h\
|
||||||
opt_range.h opt_ft.h \
|
opt_range.h opt_ft.h \
|
||||||
@ -55,7 +55,7 @@ mysqld_SOURCES = sql_lex.cc \
|
|||||||
thr_malloc.cc item_create.cc \
|
thr_malloc.cc item_create.cc \
|
||||||
field.cc key.cc sql_class.cc sql_list.cc \
|
field.cc key.cc sql_class.cc sql_list.cc \
|
||||||
net_serv.cc violite.c net_pkg.cc lock.cc my_lock.c \
|
net_serv.cc violite.c net_pkg.cc lock.cc my_lock.c \
|
||||||
sql_string.cc sql_map.cc \
|
sql_string.cc sql_manager.cc sql_map.cc \
|
||||||
mysqld.cc password.c hash_filo.cc hostname.cc \
|
mysqld.cc password.c hash_filo.cc hostname.cc \
|
||||||
convert.cc sql_parse.cc sql_yacc.yy \
|
convert.cc sql_parse.cc sql_yacc.yy \
|
||||||
sql_base.cc table.cc sql_select.cc sql_insert.cc \
|
sql_base.cc table.cc sql_select.cc sql_insert.cc \
|
||||||
|
@ -57,6 +57,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include "ha_berkeley.h"
|
#include "ha_berkeley.h"
|
||||||
|
#include "sql_manager.h"
|
||||||
|
|
||||||
#define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */
|
#define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */
|
||||||
#define HA_BERKELEY_RANGE_COUNT 100
|
#define HA_BERKELEY_RANGE_COUNT 100
|
||||||
@ -87,6 +88,7 @@ static byte* bdb_get_key(BDB_SHARE *share,uint *length,
|
|||||||
my_bool not_used __attribute__((unused)));
|
my_bool not_used __attribute__((unused)));
|
||||||
static BDB_SHARE *get_share(const char *table_name);
|
static BDB_SHARE *get_share(const char *table_name);
|
||||||
static void free_share(BDB_SHARE *share);
|
static void free_share(BDB_SHARE *share);
|
||||||
|
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice);
|
||||||
|
|
||||||
|
|
||||||
/* General functions */
|
/* General functions */
|
||||||
@ -106,6 +108,7 @@ bool berkeley_init(void)
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
db_env->set_errcall(db_env,berkeley_print_error);
|
db_env->set_errcall(db_env,berkeley_print_error);
|
||||||
db_env->set_errpfx(db_env,"bdb");
|
db_env->set_errpfx(db_env,"bdb");
|
||||||
|
db_env->set_noticecall(db_env, berkeley_noticecall);
|
||||||
db_env->set_tmp_dir(db_env, berkeley_tmpdir);
|
db_env->set_tmp_dir(db_env, berkeley_tmpdir);
|
||||||
db_env->set_data_dir(db_env, mysql_data_home);
|
db_env->set_data_dir(db_env, mysql_data_home);
|
||||||
if (berkeley_logdir)
|
if (berkeley_logdir)
|
||||||
@ -120,6 +123,7 @@ bool berkeley_init(void)
|
|||||||
db_env->set_lk_detect(db_env, berkeley_lock_type);
|
db_env->set_lk_detect(db_env, berkeley_lock_type);
|
||||||
if (berkeley_lock_max)
|
if (berkeley_lock_max)
|
||||||
db_env->set_lk_max(db_env, berkeley_lock_max);
|
db_env->set_lk_max(db_env, berkeley_lock_max);
|
||||||
|
|
||||||
if (db_env->open(db_env,
|
if (db_env->open(db_env,
|
||||||
berkeley_home,
|
berkeley_home,
|
||||||
berkeley_init_flags | DB_INIT_LOCK |
|
berkeley_init_flags | DB_INIT_LOCK |
|
||||||
@ -129,6 +133,7 @@ bool berkeley_init(void)
|
|||||||
db_env->close(db_env,0);
|
db_env->close(db_env,0);
|
||||||
db_env=0;
|
db_env=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) hash_init(&bdb_open_tables,32,0,0,
|
(void) hash_init(&bdb_open_tables,32,0,0,
|
||||||
(hash_get_key) bdb_get_key,0,0);
|
(hash_get_key) bdb_get_key,0,0);
|
||||||
pthread_mutex_init(&bdb_mutex,NULL);
|
pthread_mutex_init(&bdb_mutex,NULL);
|
||||||
@ -196,6 +201,48 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer)
|
|||||||
sql_print_error("%s: %s",db_errpfx,buffer);
|
sql_print_error("%s: %s",db_errpfx,buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice)
|
||||||
|
{
|
||||||
|
switch (notice)
|
||||||
|
{
|
||||||
|
case DB_NOTICE_LOGFILE_CHANGED:
|
||||||
|
pthread_mutex_lock(&LOCK_manager);
|
||||||
|
manager_status |= MANAGER_BERKELEY_LOG_CLEANUP;
|
||||||
|
pthread_mutex_unlock(&LOCK_manager);
|
||||||
|
pthread_cond_signal(&COND_manager);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void berkeley_cleanup_log_files(void)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("berkeley_cleanup_log_files");
|
||||||
|
char **names;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
/* XXX: Probably this should be done somewhere else, and
|
||||||
|
* should be tunable by the user. */
|
||||||
|
if ((error = txn_checkpoint(db_env, 0, 0, 0)))
|
||||||
|
my_error(ER_ERROR_DURING_CHECKPOINT, MYF(0), error);
|
||||||
|
|
||||||
|
if ((error = log_archive(db_env, &names, DB_ARCH_ABS, NULL)) != 0)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("error", ("log_archive failed (error %d)", error));
|
||||||
|
db_env->err(db_env, error, "log_archive: DB_ARCH_ABS");
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (names)
|
||||||
|
{
|
||||||
|
char **np;
|
||||||
|
for (np = names; *np; ++np)
|
||||||
|
my_delete(*np, MYF(MY_WME));
|
||||||
|
|
||||||
|
free(names);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
@ -422,6 +422,17 @@ int mysql_load(THD *thd,sql_exchange *ex, TABLE_LIST *table_list,
|
|||||||
List<Item> &fields, enum enum_duplicates handle_duplicates,
|
List<Item> &fields, enum enum_duplicates handle_duplicates,
|
||||||
bool local_file,thr_lock_type lock_type);
|
bool local_file,thr_lock_type lock_type);
|
||||||
int write_record(TABLE *table,COPY_INFO *info);
|
int write_record(TABLE *table,COPY_INFO *info);
|
||||||
|
|
||||||
|
/* sql_manager.cc */
|
||||||
|
/* bits set in manager_status */
|
||||||
|
#define MANAGER_BERKELEY_LOG_CLEANUP (1L << 0)
|
||||||
|
extern ulong manager_status;
|
||||||
|
extern bool volatile manager_thread_in_use;
|
||||||
|
extern pthread_t manager_thread;
|
||||||
|
extern pthread_mutex_t LOCK_manager;
|
||||||
|
extern pthread_cond_t COND_manager;
|
||||||
|
pthread_handler_decl(handle_manager, arg);
|
||||||
|
|
||||||
/* sql_test.cc */
|
/* sql_test.cc */
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
void print_where(COND *cond,const char *info);
|
void print_where(COND *cond,const char *info);
|
||||||
|
@ -154,7 +154,6 @@ static my_string opt_logname=0,opt_update_logname=0,
|
|||||||
opt_binlog_index_name = 0,opt_slow_logname=0;
|
opt_binlog_index_name = 0,opt_slow_logname=0;
|
||||||
static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN];
|
static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN];
|
||||||
static pthread_t select_thread;
|
static pthread_t select_thread;
|
||||||
static pthread_t flush_thread; // Used when debugging
|
|
||||||
static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
|
static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
|
||||||
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
|
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
|
||||||
opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4;
|
opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4;
|
||||||
@ -214,7 +213,7 @@ ulong max_tmp_tables,max_heap_table_size;
|
|||||||
ulong bytes_sent = 0L, bytes_received = 0L;
|
ulong bytes_sent = 0L, bytes_received = 0L;
|
||||||
|
|
||||||
bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory;
|
bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory;
|
||||||
bool volatile abort_loop,select_thread_in_use,flush_thread_in_use,grant_option;
|
bool volatile abort_loop,select_thread_in_use,grant_option;
|
||||||
bool volatile ready_to_exit,shutdown_in_progress;
|
bool volatile ready_to_exit,shutdown_in_progress;
|
||||||
ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */
|
ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */
|
||||||
ulong query_id=1L,long_query_count,long_query_time,aborted_threads,
|
ulong query_id=1L,long_query_count,long_query_time,aborted_threads,
|
||||||
@ -257,10 +256,10 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
|||||||
LOCK_mapped_file, LOCK_status, LOCK_grant,
|
LOCK_mapped_file, LOCK_status, LOCK_grant,
|
||||||
LOCK_error_log,
|
LOCK_error_log,
|
||||||
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
|
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create,
|
||||||
LOCK_flush, LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
||||||
LOCK_binlog_update, LOCK_slave, LOCK_server_id;
|
LOCK_binlog_update, LOCK_slave, LOCK_server_id;
|
||||||
|
|
||||||
pthread_cond_t COND_refresh,COND_thread_count,COND_flush, COND_binlog_update,
|
pthread_cond_t COND_refresh,COND_thread_count,COND_binlog_update,
|
||||||
COND_slave_stopped;
|
COND_slave_stopped;
|
||||||
pthread_cond_t COND_thread_cache,COND_flush_thread_cache;
|
pthread_cond_t COND_thread_cache,COND_flush_thread_cache;
|
||||||
pthread_t signal_thread;
|
pthread_t signal_thread;
|
||||||
@ -289,7 +288,6 @@ static pthread_handler_decl(handle_connections_namedpipes,arg);
|
|||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
static int get_service_parameters();
|
static int get_service_parameters();
|
||||||
#endif
|
#endif
|
||||||
static pthread_handler_decl(handle_flush,arg);
|
|
||||||
extern pthread_handler_decl(handle_slave,arg);
|
extern pthread_handler_decl(handle_slave,arg);
|
||||||
#ifdef SET_RLIMIT_NOFILE
|
#ifdef SET_RLIMIT_NOFILE
|
||||||
static uint set_maximum_open_files(uint max_file_limit);
|
static uint set_maximum_open_files(uint max_file_limit);
|
||||||
@ -313,13 +311,13 @@ static void close_connections(void)
|
|||||||
flush_thread_cache();
|
flush_thread_cache();
|
||||||
|
|
||||||
/* kill flush thread */
|
/* kill flush thread */
|
||||||
(void) pthread_mutex_lock(&LOCK_flush);
|
(void) pthread_mutex_lock(&LOCK_manager);
|
||||||
if (flush_thread_in_use)
|
if (manager_thread_in_use)
|
||||||
{
|
{
|
||||||
DBUG_PRINT("quit",("killing flush thread: %lx",flush_thread));
|
DBUG_PRINT("quit",("killing manager thread: %lx",manager_thread));
|
||||||
(void) pthread_cond_signal(&COND_flush);
|
(void) pthread_cond_signal(&COND_manager);
|
||||||
}
|
}
|
||||||
(void) pthread_mutex_unlock(&LOCK_flush);
|
(void) pthread_mutex_unlock(&LOCK_manager);
|
||||||
|
|
||||||
/* kill connection thread */
|
/* kill connection thread */
|
||||||
#if !defined(__WIN__) && !defined(__EMX__)
|
#if !defined(__WIN__) && !defined(__EMX__)
|
||||||
@ -1398,8 +1396,8 @@ int main(int argc, char **argv)
|
|||||||
(void) pthread_cond_init(&COND_refresh,NULL);
|
(void) pthread_cond_init(&COND_refresh,NULL);
|
||||||
(void) pthread_cond_init(&COND_thread_cache,NULL);
|
(void) pthread_cond_init(&COND_thread_cache,NULL);
|
||||||
(void) pthread_cond_init(&COND_flush_thread_cache,NULL);
|
(void) pthread_cond_init(&COND_flush_thread_cache,NULL);
|
||||||
(void) pthread_cond_init(&COND_flush,NULL);
|
(void) pthread_cond_init(&COND_manager,NULL);
|
||||||
(void) pthread_mutex_init(&LOCK_flush,NULL);
|
(void) pthread_mutex_init(&LOCK_manager,NULL);
|
||||||
(void) pthread_mutex_init(&LOCK_crypt,NULL);
|
(void) pthread_mutex_init(&LOCK_crypt,NULL);
|
||||||
(void) pthread_mutex_init(&LOCK_bytes_sent,NULL);
|
(void) pthread_mutex_init(&LOCK_bytes_sent,NULL);
|
||||||
(void) pthread_mutex_init(&LOCK_bytes_received,NULL);
|
(void) pthread_mutex_init(&LOCK_bytes_received,NULL);
|
||||||
@ -1606,11 +1604,15 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (flush_time && flush_time != ~(ulong) 0L)
|
if (
|
||||||
|
#ifdef HAVE_BERKELEY_DB
|
||||||
|
!berkeley_skip ||
|
||||||
|
#endif
|
||||||
|
(flush_time && flush_time != ~(ulong) 0L))
|
||||||
{
|
{
|
||||||
pthread_t hThread;
|
pthread_t hThread;
|
||||||
if (pthread_create(&hThread,&connection_attrib,handle_flush,0))
|
if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
|
||||||
sql_print_error("Warning: Can't create thread to handle flush");
|
sql_print_error("Warning: Can't create thread to manage maintenance");
|
||||||
}
|
}
|
||||||
|
|
||||||
// slave thread
|
// slave thread
|
||||||
@ -2177,41 +2179,6 @@ pthread_handler_decl(handle_connections_namedpipes,arg)
|
|||||||
}
|
}
|
||||||
#endif /* __NT__ */
|
#endif /* __NT__ */
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
** Create thread that automaticly flush all tables after a given time
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
pthread_handler_decl(handle_flush,arg __attribute__((unused)))
|
|
||||||
{
|
|
||||||
my_thread_init();
|
|
||||||
DBUG_ENTER("handle_flush");
|
|
||||||
|
|
||||||
pthread_detach_this_thread();
|
|
||||||
flush_thread=pthread_self();
|
|
||||||
flush_thread_in_use=1;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&LOCK_flush);
|
|
||||||
while (flush_time)
|
|
||||||
{
|
|
||||||
struct timespec abstime;
|
|
||||||
#ifdef HAVE_TIMESPEC_TS_SEC
|
|
||||||
abstime.ts_sec=time(NULL)+flush_time; // Bsd 2.1
|
|
||||||
abstime.ts_nsec=0;
|
|
||||||
#else
|
|
||||||
abstime.tv_sec=time(NULL)+flush_time; // Linux or Solairs
|
|
||||||
abstime.tv_nsec=0;
|
|
||||||
#endif
|
|
||||||
(void) pthread_cond_timedwait(&COND_flush,&LOCK_flush, &abstime);
|
|
||||||
if (abort_loop)
|
|
||||||
break;
|
|
||||||
flush_tables();
|
|
||||||
}
|
|
||||||
flush_thread_in_use=0;
|
|
||||||
pthread_mutex_unlock(&LOCK_flush);
|
|
||||||
my_thread_end();
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
** handle start options
|
** handle start options
|
||||||
|
101
sql/sql_manager.cc
Normal file
101
sql/sql_manager.cc
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sql_manager.cc
|
||||||
|
* This thread manages various maintenance tasks.
|
||||||
|
*
|
||||||
|
* o Flushing the tables every flush_time seconds.
|
||||||
|
* o Berkeley DB: removing unneeded log files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mysql_priv.h"
|
||||||
|
#include "sql_manager.h"
|
||||||
|
|
||||||
|
ulong manager_status;
|
||||||
|
bool volatile manager_thread_in_use;
|
||||||
|
|
||||||
|
pthread_t manager_thread;
|
||||||
|
pthread_mutex_t LOCK_manager;
|
||||||
|
pthread_cond_t COND_manager;
|
||||||
|
|
||||||
|
pthread_handler_decl(handle_manager,arg __attribute__((unused)))
|
||||||
|
{
|
||||||
|
int error = 0;
|
||||||
|
ulong status;
|
||||||
|
struct timespec abstime;
|
||||||
|
bool reset_flush_time = TRUE;
|
||||||
|
my_thread_init();
|
||||||
|
DBUG_ENTER("handle_manager");
|
||||||
|
|
||||||
|
pthread_detach_this_thread();
|
||||||
|
manager_thread = pthread_self();
|
||||||
|
manager_status = 0;
|
||||||
|
manager_thread_in_use = 1;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&LOCK_manager);
|
||||||
|
/* XXX: This will need to be made more general to handle different
|
||||||
|
* polling needs. */
|
||||||
|
if (flush_time)
|
||||||
|
{
|
||||||
|
if (reset_flush_time)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_TIMESPEC_TS_SEC
|
||||||
|
abstime.ts_sec = time(NULL)+flush_time; // Bsd 2.1
|
||||||
|
abstime.ts_nsec = 0;
|
||||||
|
#else
|
||||||
|
abstime.tv_sec = time(NULL)+flush_time; // Linux or Solairs
|
||||||
|
abstime.tv_nsec = 0;
|
||||||
|
#endif
|
||||||
|
reset_flush_time = FALSE;
|
||||||
|
}
|
||||||
|
while (!manager_status && !error && !abort_loop)
|
||||||
|
error = pthread_cond_timedwait(&COND_manager, &LOCK_manager, &abstime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while (!manager_status && !error && !abort_loop)
|
||||||
|
error = pthread_cond_wait(&COND_manager, &LOCK_manager);
|
||||||
|
status = manager_status;
|
||||||
|
manager_status = 0;
|
||||||
|
pthread_mutex_unlock(&LOCK_manager);
|
||||||
|
|
||||||
|
if (abort_loop)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (error) /* == ETIMEDOUT */
|
||||||
|
{
|
||||||
|
flush_tables();
|
||||||
|
error = 0;
|
||||||
|
reset_flush_time = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_BERKELEY_DB
|
||||||
|
if (status & MANAGER_BERKELEY_LOG_CLEANUP)
|
||||||
|
{
|
||||||
|
berkeley_cleanup_log_files();
|
||||||
|
status &= ~MANAGER_BERKELEY_LOG_CLEANUP;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
DBUG_PRINT("error", ("manager did not handle something: %lx", status));
|
||||||
|
}
|
||||||
|
manager_thread_in_use = 0;
|
||||||
|
my_thread_end();
|
||||||
|
DBUG_RETURN(NULL);
|
||||||
|
}
|
19
sql/sql_manager.h
Normal file
19
sql/sql_manager.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||||
|
|
||||||
|
#ifdef HAVE_BERKELEY_DB
|
||||||
|
void berkeley_cleanup_log_files(void);
|
||||||
|
#endif /* HAVE_BERKELEY_DB */
|
Loading…
x
Reference in New Issue
Block a user