diff options
author | unknown <monty@donna.mysql.com> | 2000-09-16 04:27:21 +0300 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2000-09-16 04:27:21 +0300 |
commit | e6e3c8b6c48715dea90e939f23026965d28afb82 (patch) | |
tree | 6e20280a8abcc28d14385983250a3e1823639028 | |
parent | 7f27285af709c8a2b65ad6f8587940ec2e461f12 (diff) | |
download | mariadb-git-e6e3c8b6c48715dea90e939f23026965d28afb82.tar.gz |
Faster log::write() call, memory leak fix, flush master fix.
BUILD/compile-alpha-ccc:
remove deps to get things to compile better
Docs/manual.texi:
Small fixes
configure.in:
Fix for mlockmem()
include/my_sys.h:
Made key_cache_inited global
myisammrg/myrg_close.c:
Fixed memory leak
myisammrg/myrg_open.c:
Initialize queue to avoid memory leak bug
mysys/mf_format.c:
Added overflow check
mysys/mf_keycache.c:
Made key_cache_init more secure to use
mysys/my_static.h:
Make key_cache_inite global
sql/ChangeLog:
Changes
sql/lock.cc:
Added logging of locktime
sql/log.cc:
Added logging of locktime
sql/mysql_priv.h:
Added locked_in_memory
sql/mysqld.cc:
Added logging of locktime + locked in memory
sql/sql_acl.cc:
Added thd to log::write() for faster call
sql/sql_base.cc:
Use global key_cache variable
sql/sql_class.cc:
Added result row counting
sql/sql_class.h:
Added thd to log::write() for faster call
sql/sql_db.cc:
Added thd to log::write() for faster call
sql/sql_delete.cc:
Added thd to log::write() for faster call
sql/sql_insert.cc:
Added thd to log::write() for faster call
sql/sql_load.cc:
Added thd to log::write() for faster call
sql/sql_parse.cc:
Added thd to log::write() for faster call
sql/sql_rename.cc:
Added thd to log::write() for faster call
sql/sql_table.cc:
Added thd to log::write() for faster call
sql/sql_update.cc:
Added thd to log::write() for faster call
-rwxr-xr-x | BUILD/compile-alpha-ccc | 4 | ||||
-rw-r--r-- | Docs/manual.texi | 75 | ||||
-rw-r--r-- | configure.in | 4 | ||||
-rw-r--r-- | include/my_sys.h | 3 | ||||
-rw-r--r-- | myisammrg/myrg_close.c | 4 | ||||
-rw-r--r-- | myisammrg/myrg_open.c | 12 | ||||
-rw-r--r-- | mysys/mf_format.c | 6 | ||||
-rw-r--r-- | mysys/mf_keycache.c | 3 | ||||
-rw-r--r-- | mysys/my_static.h | 2 | ||||
-rw-r--r-- | sql/ChangeLog | 4 | ||||
-rw-r--r-- | sql/lock.cc | 1 | ||||
-rw-r--r-- | sql/log.cc | 83 | ||||
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 69 | ||||
-rw-r--r-- | sql/sql_acl.cc | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 9 | ||||
-rw-r--r-- | sql/sql_class.cc | 10 | ||||
-rw-r--r-- | sql/sql_class.h | 12 | ||||
-rw-r--r-- | sql/sql_db.cc | 20 | ||||
-rw-r--r-- | sql/sql_delete.cc | 18 | ||||
-rw-r--r-- | sql/sql_insert.cc | 27 | ||||
-rw-r--r-- | sql/sql_load.cc | 14 | ||||
-rw-r--r-- | sql/sql_parse.cc | 84 | ||||
-rw-r--r-- | sql/sql_rename.cc | 9 | ||||
-rw-r--r-- | sql/sql_table.cc | 40 | ||||
-rw-r--r-- | sql/sql_update.cc | 9 |
26 files changed, 321 insertions, 205 deletions
diff --git a/BUILD/compile-alpha-ccc b/BUILD/compile-alpha-ccc index 9a92de2590d..48cc0857cbf 100755 --- a/BUILD/compile-alpha-ccc +++ b/BUILD/compile-alpha-ccc @@ -6,11 +6,13 @@ aclocal; autoheader; aclocal; automake; autoconf CC=ccc CFLAGS="-fast -O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -mcpu=ev6 -Wa,-mev6" CXXLDFLAGS='/usr/lib/compaq/libots-2.2.7/libots.so /usr/lib/compaq/cpml-5.0.0/libcpml_ev6.a' ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client make +rm */.deps/* +make if [ $? = 0 ] then rm */.deps/* bin/mysqladmin shutdown - make install + sur make install if [ $? = 0 ] then scripts/make_binary_distribution diff --git a/Docs/manual.texi b/Docs/manual.texi index a730f7d15cf..c21ef60079b 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -5917,12 +5917,12 @@ The solution to this is to do one of the following steps: @itemize @bullet @item +Configure with @code{CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure} +@item Edit @file{/usr/include/widec.h} as indicted above and rerun configure @item Remove the @code{#define HAVE_TERM} line from @file{config.h} file and run @code{make} again. -@item -Configure with @code{CFLAGS=-DHAVE_CURSES CXXFLAGS=-DHAVE_CURSES ./configure} @end itemize If you get a problem that your linker can't find @code{-lz} when linking @@ -5950,9 +5950,9 @@ experience problems with core dumps under load, you should use the following @code{configure} command: @example -shell> CC=gcc CFLAGS="-O6 -fomit-frame-pointer" \ +shell> CC=gcc CFLAGS="-O6 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ - CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" \ + CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \ ./configure --prefix=/usr/local/mysql @end example @@ -8557,6 +8557,11 @@ LOW_PRIORITY ...} to lower the priority of only one query, or by priority in one thread. @xref{Table locking}. +@item --memlock +Lock the @code{mysqld} process in memory. This works only if your system +supports the @code{mlockall()} system call. This may help if you have +a problem where the opearting system is causing @code{mysqld} to swap on disk. + @item --pid-file=path Path to pid file used by @code{safe_mysqld}. @@ -8597,6 +8602,11 @@ because sometimes it takes a long time to perform backward resolutions. @strong{MySQL} 3.22 caches hostnames (unless @code{--skip-host-cache} is used) and has this option enabled by default. +@item --skip-concurrent-insert +Turn of that one can insert and select at the same time on @code{MyISAM} +tables. (This is only to be used if you think you have found a bug +in this feature). + @item --skip-delay-key-write Ignore the @code{delay_key_write} option for all tables. @xref{Server parameters}. @@ -10210,13 +10220,14 @@ The following @code{mysqld} options affect networking security: @table @code @item --secure -IP numbers returned by the @code{gethostbyname()} system call are checked to -make sure they resolve back to the original hostname. This makes it harder -for someone on the outside to get access by pretending to be another host. This -option also adds some sanity checks of hostnames. The option is turned off -by default in @strong{MySQL} 3.21 because sometimes it takes a long time to -perform backward resolutions. @strong{MySQL} 3.22 caches hostnames and has -this option enabled by default. +IP numbers returned by the @code{gethostbyname()} system call are +checked to make sure they resolve back to the original hostname. This +makes it harder for someone on the outside to get access by pretending +to be another host. This option also adds some sanity checks of +hostnames. The option is turned off by default in @strong{MySQL} 3.21 +because sometimes it takes a long time to perform backward resolutions. +@strong{MySQL} 3.22 caches hostnames and has this option enabled by +default. @item --skip-grant-tables This option causes the server not to use the privilege system at all. This @@ -17953,6 +17964,10 @@ files directly, because the contents of the file must travel from the client host to the server host. On the other hand, you do not need the @strong{file} privilege to load local files. +Note that you can't read from a FIFO with @code{LOAD DATA INFILE}; If +you need to read from a FIFO (for example the output from gunzip), use +@code{LOAD DATA LOCAL INFILE} instead. + @cindex @code{mysqlimport} You can also load data files by using the @code{mysqlimport} utility; it operates by sending a @code{LOAD DATA INFILE} command to the server. The @@ -35513,12 +35528,13 @@ only on Linux. You can always find the latest version @uref{http://www.trash.net/~ffischer/admin/index.html, here}. -@item @uref{http://www.mysql.com/Downloads/Win32/MySQL-Maker092.zip,MySQL-Maker 092}. -Shareware @strong{MySQL} client for windows. It's WYSIWYG tool which allows -you to create, change and delete databases and tables. -You can change field - structure and add, change and delete data in -these tables directly without ODBC-driver. -@uref{http://62.26.183.157/presult/support/su_sweiche_download.html, MySQL Maker homepage} +@c Link temporary removed on request because of a bug in the current version +@c @item @uref{http://www.mysql.com/Downloads/Win32/MySQL-Maker092.zip,MySQL-Maker 092}. +@c Shareware @strong{MySQL} client for windows. It's WYSIWYG tool which allows +@c you to create, change and delete databases and tables. +@c You can change field - structure and add, change and delete data in +@c these tables directly without ODBC-driver. +@c @uref{http://62.26.183.157/presult/support/su_sweiche_download.html, MySQL Maker homepage} @item @uref{http://www.mysql.com/Downloads/Contrib/mysqlwinadmn.zip, mysqlwinadmn.zip} Windows GUI (binary only) to administrate a database, by David B. Mansel, @@ -35653,9 +35669,9 @@ programming! By Marc Beneteau, @email{marc@@odbsoft.com}. @item @uref{http://www.mysql.com/Downloads/Contrib/sqlhtml.tar.gz, sqlhtml.tar.gz} SQL/HTML is an HTML database manager for @strong{MySQL} using @code{DBI} 1.06. -@item @uref{http://www.mysql.com/Downloads/Contrib/udmsearch-3.0.21.tar.gz, UdmSearch 3.0.21 (stable version)} +@item @uref{http://www.mysql.com/Downloads/Contrib/udmsearch-3.0.21.tar.gz, UdmSearch 3.0.22 (stable version)} @item @uref{http://www.mysql.com/Downloads/Contrib/udmsearch-3.1.3.tar.gz, UdmSearch 3.1.3 (development version)} -@item @uref{http://mysearch.udm.net, UdmSearch home page} +@item @uref{http://search.mnoGo.ru, UdmSearch home page} A SQL-based search engine for Internet. By Alexander I. Barkov @email{bar@@izhcom.ru}. @@ -36291,6 +36307,19 @@ though, so 3.23 is not released as a stable version yet. @appendixsubsec Changes in release 3.23.25 @itemize @bullet @item +Fixed a core dump bug when doing @code{FLUSH MASTER} when one didn't give +a filename argument to @code{--log-bin} +@item +Added missing ha_berkeley.x files to the MySQL windows source distribution. +@item +Fixed some mutex bugs in the log code that could cause thread blocks if new +log files couldn't be created. +@item +Added lock time and number of selected processed rows to slow query log. +@item +Added @code{--memlock} option to mysqld to lock mysqld in memory on +systems with the @code{mlockall()} call (like in Solaris). +@item @code{HEAP} tables didn't use keys properly. (Bug from 3.23.23) @item Added better support for @code{MERGE} tables (keys, mapping, creation, @@ -40543,6 +40572,8 @@ Subqueries. @code{select id from t where grp in (select grp from g where u > 100 @item Add range checking to @code{MERGE} tables. @item +@code{SHOW OPEN TABLES} +@item Port of @strong{MySQL} to BeOS. @item Add a temporary key buffer cache during @code{insert/delete/update} so that we @@ -40802,18 +40833,12 @@ Negative @code{LIMIT} to retrieve data from the end. @item Alarm around client connect/read/write functions. @item -Make a @code{mysqld} version which isn't multithreaded (3-5 days). -@item Please note the changes to @code{safe_mysqld}: according to FSSTND (which Debian tries to follow) PID files should go into @file{/var/run/<progname>.pid} and log files into @file{/var/log}. It would be nice if you could put the "DATADIR" in the first declaration of "pidfile" and "log", so the placement of these files can be changed with a single statement. @item -Better dynamic record layout to avoid fragmentation. -@item -@code{UPDATE SET blob=read_blob_from_file('my_gif') where id=1;} -@item Allow a client to request logging. @item Add use of @code{zlib()} for @code{gzip}-ed files to @code{LOAD DATA INFILE}. diff --git a/configure.in b/configure.in index ba1af972063..8170fed6905 100644 --- a/configure.in +++ b/configure.in @@ -1172,7 +1172,7 @@ AC_SUBST(MAKE_SHELL) # Already-done: stdlib.h string.h unistd.h termios.h AC_CHECK_HEADERS(varargs.h stdarg.h dirent.h locale.h ndir.h sys/dir.h \ sys/file.h sys/ndir.h sys/ptem.h sys/pte.h sys/select.h sys/stream.h \ - curses.h termcap.h termio.h termbits.h asm/termbits.h grp.h) + sys/mman.h curses.h termcap.h termio.h termbits.h asm/termbits.h grp.h) # Already-done: strcasecmp AC_CHECK_FUNCS(lstat putenv select setenv setlocale strcoll tcgetattr) @@ -1218,7 +1218,7 @@ AC_CHECK_FUNCS(alarm bmove \ pthread_setschedparam pthread_attr_setprio pthread_attr_setschedparam \ pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \ pthread_condattr_create rwlock_init pthread_rwlock_rdlock \ - crypt dlopen dlerror fchmod getpass getpassphrase initgroups) + crypt dlopen dlerror fchmod getpass getpassphrase initgroups, mlockall) # Sanity check: We chould not have any fseeko symbol unless # large_file_support=yes diff --git a/include/my_sys.h b/include/my_sys.h index e47d2837433..ddea92ea185 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -179,11 +179,12 @@ extern void free_charsets(void); extern char *list_charsets(myf want_flags); /* my_free() this string... */ -/* statisticts */ +/* statistics */ extern ulong _my_cache_w_requests,_my_cache_write,_my_cache_r_requests, _my_cache_read; extern ulong _my_blocks_used,_my_blocks_changed; extern uint my_file_opened,my_stream_opened; +extern my_bool key_cache_inited; /* Point to current my_message() */ extern void (*my_sigtstp_cleanup)(void), diff --git a/myisammrg/myrg_close.c b/myisammrg/myrg_close.c index 0b9acd921ae..7ab73c5ded4 100644 --- a/myisammrg/myrg_close.c +++ b/myisammrg/myrg_close.c @@ -18,8 +18,7 @@ #include "mymrgdef.h" -int myrg_close(info) -register MYRG_INFO *info; +int myrg_close(MYRG_INFO *info) { int error=0,new_error; MYRG_TABLE *file; @@ -28,6 +27,7 @@ register MYRG_INFO *info; for (file=info->open_tables ; file != info->end_table ; file++) if ((new_error=mi_close(file->table))) error=new_error; + delete_queue(&info->by_key); pthread_mutex_lock(&THR_LOCK_open); myrg_open_list=list_delete(myrg_open_list,&info->open_list); pthread_mutex_unlock(&THR_LOCK_open); diff --git a/myisammrg/myrg_open.c b/myisammrg/myrg_open.c index c12fa1fa52b..7f80a88dddc 100644 --- a/myisammrg/myrg_open.c +++ b/myisammrg/myrg_open.c @@ -86,7 +86,7 @@ int handle_locking; *m_info=info; m_info->open_tables=(MYRG_TABLE *) (m_info+1); m_info->tables=files; - + for (i=files ; i-- > 0 ; ) { m_info->open_tables[i].table=isam; @@ -104,12 +104,16 @@ int handle_locking; m_info->open_tables[i].file_offset=(my_off_t) file_offset; file_offset+=m_info->open_tables[i].table->state->data_file_length; } + errpos=2; if (sizeof(my_off_t) == 4 && file_offset > (ulonglong) (ulong) ~0L) { my_errno=HA_ERR_RECORD_FILE_FULL; - my_free((char*) m_info,MYF(0)); goto err; } + /* Allocate memory for queue */ + if (m_info->open_tables->table->s->base.keys && + _myrg_init_queue(m_info,0,HA_READ_KEY_EXACT)) + goto err; m_info->end_table=m_info->open_tables+files; m_info->last_used_table=m_info->open_tables; @@ -119,12 +123,14 @@ int handle_locking; pthread_mutex_lock(&THR_LOCK_open); myrg_open_list=list_add(myrg_open_list,&m_info->open_list); pthread_mutex_unlock(&THR_LOCK_open); - m_info->by_key.root=0; DBUG_RETURN(m_info); err: save_errno=my_errno; switch (errpos) { + case 2: + my_free((char*) m_info,MYF(0)); + /* Fall through */ case 1: VOID(my_fclose(file,MYF(0))); for (i=files ; i-- > 0 ; ) diff --git a/mysys/mf_format.c b/mysys/mf_format.c index 623f1dbd19e..39084799563 100644 --- a/mysys/mf_format.c +++ b/mysys/mf_format.c @@ -31,6 +31,7 @@ /* 8 Pack filename as short as possibly */ /* 16 Resolve symbolic links for filename */ /* 32 Resolve filename to full path */ + /* 64 Return NULL if too long path */ #ifdef MAXPATHLEN #define BUFF_LEN MAXPATHLEN @@ -80,7 +81,10 @@ my_string fn_format(my_string to, const char *name, const char *dsk, if (strlen(dev)+length+strlen(ext) >= FN_REFLEN || length >= FN_LEN ) { /* To long path, return original */ - uint tmp_length=strlength(startpos); + uint tmp_length; + if (flag & 64) + return 0; + tmp_length=strlength(startpos); DBUG_PRINT("error",("dev: '%s' ext: '%s' length: %d",dev,ext,length)); (void) strmake(to,startpos,min(tmp_length,FN_REFLEN-1)); } diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c index db23c474564..72d0d4a5e10 100644 --- a/mysys/mf_keycache.c +++ b/mysys/mf_keycache.c @@ -85,7 +85,7 @@ int init_key_cache(ulong use_mem, if (key_cache_inited && _my_disk_blocks > 0) { - DBUG_PRINT("warning",("key cache allready in use")); /* purecov: inspected */ + DBUG_PRINT("warning",("key cache already in use")); /* purecov: inspected */ DBUG_RETURN(0); /* purecov: inspected */ } if (! key_cache_inited) @@ -161,6 +161,7 @@ void end_key_cache(void) _my_disk_blocks= -1; } } + key_cache_inited=0; DBUG_PRINT("status", ("used: %d changed: %d w_requests: %ld writes: %ld r_requests: %ld reads: %ld", _my_blocks_used,_my_blocks_changed,_my_cache_w_requests, diff --git a/mysys/my_static.h b/mysys/my_static.h index 5ab01dec9a9..e9d1a30b786 100644 --- a/mysys/my_static.h +++ b/mysys/my_static.h @@ -52,8 +52,6 @@ extern char NEAR curr_dir[FN_REFLEN],NEAR home_dir_buff[FN_REFLEN]; extern volatile int _my_signals; extern struct st_remember _my_sig_remember[MAX_SIGNALS]; -extern my_bool key_cache_inited; - extern const char *soundex_map; extern USED_MEM* my_once_root_block; diff --git a/sql/ChangeLog b/sql/ChangeLog index fe67aca1cc0..df9b2567113 100644 --- a/sql/ChangeLog +++ b/sql/ChangeLog @@ -1,3 +1,7 @@ +2000-09-15 Michael Widenius <monty@mysql.com> + +* Added a thd argument to log::write() to get more speed. + 2000-09-01 Michael Widenius <monty@mysql.com> * Avoid allocation of "localhost" string. diff --git a/sql/lock.cc b/sql/lock.cc index eba1851bae0..7eb42f6b084 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -127,6 +127,7 @@ retry: sql_lock=0; } } + thd->lock_time(); DBUG_RETURN (sql_lock); } diff --git a/sql/log.cc b/sql/log.cc index 29ca0247a1b..c5862621cfd 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -338,7 +338,7 @@ void MYSQL_LOG::new_file() close(); open(old_name, log_type, new_name); my_free(old_name,MYF(0)); - if (!file) // Something got wrong + if (!file) // Something went wrong log_type=LOG_CLOSED; last_time=query_start=0; write_error=0; @@ -347,10 +347,10 @@ void MYSQL_LOG::new_file() } -void MYSQL_LOG::write(enum enum_server_command command, +void MYSQL_LOG::write(THD *thd,enum enum_server_command command, const char *format,...) { - if (name && (what_to_log & (1L << (uint) command))) + if (is_open() && (what_to_log & (1L << (uint) command))) { va_list args; va_start(args,format); @@ -359,7 +359,6 @@ void MYSQL_LOG::write(enum enum_server_command command, { time_t skr; ulong id; - THD *thd=current_thd; int error=0; if (thd) { // Normal thread @@ -423,14 +422,14 @@ void MYSQL_LOG::write(enum enum_server_command command, void MYSQL_LOG::write(Query_log_event* event_info) { - if (name) + if (is_open()) { VOID(pthread_mutex_lock(&LOCK_log)); - if(file) + if (file) { THD *thd=event_info->thd; if ((!(thd->options & OPTION_BIN_LOG) && - thd->master_access & PROCESS_ACL) || + thd->master_access & PROCESS_ACL) || !db_ok(event_info->db, binlog_do_db, binlog_ignore_db)) { VOID(pthread_mutex_unlock(&LOCK_log)); @@ -457,57 +456,50 @@ void MYSQL_LOG::write(Query_log_event* event_info) } } - if(event_info->write(file)) + if (event_info->write(file)) { sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); } err: VOID(pthread_cond_broadcast(&COND_binlog_update)); - - VOID(pthread_mutex_unlock(&LOCK_log)); } + VOID(pthread_mutex_unlock(&LOCK_log)); } - } void MYSQL_LOG::write(Load_log_event* event_info) { - if(name) + if (is_open()) { VOID(pthread_mutex_lock(&LOCK_log)); - if(file) + if (file) { THD *thd=event_info->thd; - if (!(thd->options & OPTION_BIN_LOG) && - (thd->master_access & PROCESS_ACL)) + if ((thd->options & OPTION_BIN_LOG) || + !(thd->master_access & PROCESS_ACL)) { - VOID(pthread_mutex_unlock(&LOCK_log)); - return; + if (event_info->write(file)) + sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); + VOID(pthread_cond_broadcast(&COND_binlog_update)); } - - - if (event_info->write(file)) - sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno); - VOID(pthread_cond_broadcast(&COND_binlog_update)); - - VOID(pthread_mutex_unlock(&LOCK_log)); } + VOID(pthread_mutex_unlock(&LOCK_log)); } } /* Write update log in a format suitable for incremental backup */ -void MYSQL_LOG::write(const char *query, uint query_length, - ulong time_for_query) +void MYSQL_LOG::write(THD *thd,const char *query, uint query_length, + time_t query_start) { - if (name) + if (is_open()) { + time_t current_time; VOID(pthread_mutex_lock(&LOCK_log)); if (file) { // Safety agains reopen int error=0; - THD *thd=current_thd; char buff[80],*end; end=buff; if (!(thd->options & OPTION_UPDATE_LOG) && @@ -518,13 +510,13 @@ void MYSQL_LOG::write(const char *query, uint query_length, } if (specialflag & SPECIAL_LONG_LOG_FORMAT) { - time_t skr=time(NULL); - if (skr != last_time) + current_time=time(NULL); + if (current_time != last_time) { - last_time=skr; + last_time=current_time; struct tm tm_tmp; struct tm *start; - localtime_r(&skr,&tm_tmp); + localtime_r(¤t_time,&tm_tmp); start=&tm_tmp; if (fprintf(file,"# Time: %02d%02d%02d %2d:%02d:%02d\n", start->tm_year % 100, @@ -542,8 +534,16 @@ void MYSQL_LOG::write(const char *query, uint query_length, thd->ip ? thd->ip : "") < 0) error=errno;; } - if (time_for_query) - fprintf(file,"# Time: %lu\n",time_for_query); + if (query_start) + { + /* For slow query log */ + if (!(specialflag & SPECIAL_LONG_LOG_FORMAT)) + current_time=time(NULL); + fprintf(file,"# Time: %lu Lock_time: %lu Rows_sent %lu\n", + (ulong) (current_time - query_start), + (ulong) (thd->time_after_lock - query_start), + (ulong) thd->sent_row_count); + } if (thd->db && strcmp(thd->db,db)) { // Database changed if (fprintf(file,"use %s;\n",thd->db) < 0) @@ -637,16 +637,15 @@ void MYSQL_LOG::close(bool exiting) name=0; } - if(exiting && index_file) + if (exiting && index_file) + { + if (my_fclose(index_file,MYF(0)) < 0 && ! write_error) { - if (my_fclose(index_file,MYF(0)) < 0 && ! write_error) - { - write_error=1; - sql_print_error(ER(ER_ERROR_ON_WRITE),name,errno); - } - index_file=0; - + write_error=1; + sql_print_error(ER(ER_ERROR_ON_WRITE),name,errno); } + index_file=0; + } } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 18930468541..46437dfff0c 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -458,7 +458,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, extern pthread_cond_t COND_refresh,COND_thread_count, COND_binlog_update, COND_slave_stopped; extern pthread_attr_t connection_attrib; -extern bool opt_endinfo,using_udf_functions; +extern bool opt_endinfo,using_udf_functions, locked_in_memory; extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count, ha_read_key_count, ha_read_next_count, ha_read_prev_count, ha_read_first_count, ha_read_last_count, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4d3dc8de519..b8c77d81bd9 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -72,6 +72,10 @@ int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING; #endif /* HAVE_LIBWRAP */ +#ifdef HAVE_SYS_MMAN_H +#include <sys/mman.h> +#endif + #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) #include <ieeefp.h> #ifdef HAVE_FP_EXCEPT // Fix type conflict @@ -139,13 +143,13 @@ static my_socket unix_sock= INVALID_SOCKET,ip_sock= INVALID_SOCKET; static ulong back_log,connect_timeout,concurrency; static my_string opt_logname=0,opt_update_logname=0, opt_binlog_index_name = 0,opt_slow_logname=0; -my_string opt_bin_logname = 0; // this one needs to be seen in sql_parse.cc +my_string opt_bin_logname = 0; // this one needs to be seen in sql_parse.cc static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN]; 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, opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0, - opt_ansi_mode,opt_myisam_log=0; + opt_ansi_mode=0,opt_myisam_log=0; bool opt_sql_bin_update = 0, opt_log_slave_updates = 0; // if sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync, and are @@ -197,7 +201,7 @@ uint master_port = MYSQL_PORT, master_connect_retry = 60; ulong max_tmp_tables,max_heap_table_size; ulong bytes_sent = 0L, bytes_received = 0L; -bool opt_endinfo,using_udf_functions,low_priority_updates; +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 ready_to_exit,shutdown_in_progress; ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */ @@ -589,6 +593,7 @@ void clean_up(void) x_free((gptr) errmsg[ERRMAPP]); /* Free messages */ free_defaults(defaults_argv); my_free(mysql_tmpdir,MYF(0)); + x_free(opt_bin_logname); my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0); /* Tell main we are ready */ @@ -1472,6 +1477,13 @@ int main(int argc, char **argv) LOG_NEW); if (opt_bin_log) { + if (!opt_bin_logname) + { + char tmp[FN_REFLEN]; + strnmov(tmp,hostname,FN_REFLEN-5); + strmov(strcend(tmp,'.'),"-bin"); + opt_bin_logname=my_strdup(tmp,MYF(MY_WME)); + } mysql_bin_log.set_index_file_name(opt_binlog_index_name); open_log(&mysql_bin_log, hostname, opt_bin_logname, "-bin", LOG_BIN); @@ -1484,6 +1496,21 @@ int main(int argc, char **argv) sql_print_error("Can't init databases"); exit(1); } +#ifdef HAVE_MLOCKALL + if (locked_in_memory && !geteuid()) + { + ha_key_cache(); + if (mlockall(MCL_CURRENT)) + { + sql_print_error("Warning: Failed to lock memory. Errno: %d\n",errno); + } + else + locked_in_memory=1; + } +#else + locked_in_memory=0; +#endif + if (opt_myisam_log) (void) mi_log( 1 ); ft_init_stopwords(ft_precompiled_stopwords); /* SerG */ @@ -2171,7 +2198,8 @@ enum options { OPT_MASTER_CONNECT_RETRY, OPT_SQL_BIN_UPDATE_SAME, OPT_REPLICATE_DO_DB, OPT_REPLICATE_IGNORE_DB, OPT_LOG_SLAVE_UPDATES, OPT_BINLOG_DO_DB, - OPT_BINLOG_IGNORE_DB, OPT_WANT_CORE + OPT_BINLOG_IGNORE_DB, OPT_WANT_CORE, + OPT_SKIP_CONCURRENT_INSERT, OPT_MEMLOCK }; static struct option long_options[] = { @@ -2225,6 +2253,7 @@ static struct option long_options[] = { {"master-port", required_argument, 0, (int) OPT_MASTER_PORT}, {"master-connect-retry", required_argument, 0, (int) OPT_MASTER_CONNECT_RETRY}, {"master-info-file", required_argument, 0, (int) OPT_MASTER_INFO_FILE}, + {"memlock", no_argument, 0, (int) OPT_MEMLOCK}, {"new", no_argument, 0, 'n'}, {"old-protocol", no_argument, 0, 'o'}, #ifndef DBUG_OFF @@ -2240,6 +2269,7 @@ static struct option long_options[] = { #ifdef HAVE_BERKELEY_DB {"skip-bdb", no_argument, 0, (int) OPT_BDB_SKIP}, #endif + {"skip-concurrent-insert", no_argument, 0, (int) OPT_SKIP_CONCURRENT_INSERT}, {"skip-delay-key-write", no_argument, 0, (int) OPT_SKIP_DELAY_KEY_WRITE}, {"skip-grant-tables", no_argument, 0, (int) OPT_SKIP_GRANT}, {"skip-locking", no_argument, 0, (int) OPT_SKIP_LOCK}, @@ -2369,6 +2399,9 @@ struct show_var_st init_vars[]= { {"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG}, {"key_buffer_size", (char*) &keybuff_size, SHOW_LONG}, {"language", language, SHOW_CHAR}, +#ifdef HAVE_MEMLOCKALL + {"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL}, +#endif {"log", (char*) &opt_log, SHOW_BOOL}, {"log_update", (char*) &opt_update_log, SHOW_BOOL}, {"log_bin", (char*) &opt_bin_log, SHOW_BOOL}, @@ -2532,9 +2565,10 @@ static void usage(void) Log slow queries to this log file. Defaults logging\n\ to hostname-slow.log\n\ --pid-file=path Pid file used by safe_mysqld\n\ - -P, --port=... Port number to use for connection\n\ + --memlock Lock mysqld in memory\n\ -n, --new Use very new possible 'unsafe' functions\n\ - -o, --old-protocol Use the old (3.20) protocol\n"); + -o, --old-protocol Use the old (3.20) protocol\n\ + -P, --port=... Port number to use for connection\n"); #ifndef DBUG_OFF puts("\ --one-thread Only use one thread (for debugging under Linux)\n"); @@ -2546,6 +2580,8 @@ static void usage(void) Start without grant tables. This gives all users\n\ FULL ACCESS to all tables!\n\ --safe-mode Skip some optimize stages (for testing)\n\ + --skip-concurrent-insert\n\ + Don't use concurrent insert with MyISAM\n\ --skip-delay-key-write\n\ Ignore the delay_key_write option for all tables\n\ --skip-locking Don't use system locking. To use isamchk one has\n\ @@ -2607,11 +2643,12 @@ The default values (after parsing the command line arguments) are:\n\n"); printf("logfile: %s\n",opt_logname); if (opt_update_logname) printf("update log: %s\n",opt_update_logname); - if (opt_bin_logname) - { - printf("binary log: %s\n",opt_bin_logname); - printf("binary log index: %s\n",opt_binlog_index_name); - } + if (opt_bin_log) + { + printf("binary log: %s\n",opt_bin_logname ? opt_bin_logname : ""); + printf("binary log index: %s\n", + opt_binlog_index_name ? opt_binlog_index_name : ""); + } if (opt_slow_logname) printf("update log: %s\n",opt_slow_logname); printf("TCP port: %d\n",mysql_port); @@ -2771,7 +2808,9 @@ static void get_options(int argc,char **argv) break; case (int) OPT_BIN_LOG: opt_bin_log=1; - opt_bin_logname=optarg; + x_free(opt_bin_logname); + if (optarg && optarg[0]) + opt_bin_logname=my_strdup(optarg,MYF(0)); break; case (int) OPT_LOG_SLAVE_UPDATES: opt_log_slave_updates = 1; @@ -2820,6 +2859,9 @@ static void get_options(int argc,char **argv) myisam_delay_key_write=0; myisam_concurrent_insert=0; break; + case (int) OPT_SKIP_CONCURRENT_INSERT: + myisam_concurrent_insert=0; + break; case (int) OPT_SKIP_PRIOR: opt_specialflag|= SPECIAL_NO_PRIOR; break; @@ -2853,6 +2895,9 @@ static void get_options(int argc,char **argv) opt_specialflag|=SPECIAL_SKIP_SHOW_DB; mysql_port=0; break; + case (int) OPT_MEMLOCK: + locked_in_memory=1; + break; case (int) OPT_ONE_THREAD: test_flags |= TEST_NO_THREADS; break; diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 5089c8d75ee..f103fce1ad9 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -820,7 +820,7 @@ bool change_password(THD *thd, const char *host, const char *user, acl_user->user, acl_user->host.hostname ? acl_user->host.hostname : "", new_password)); - mysql_update_log.write(buff,(uint) strlen(buff)); + mysql_update_log.write(thd,buff,qinfo.q_len); mysql_bin_log.write(&qinfo); return 0; } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 84213a26b94..a37506bcbf4 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -29,7 +29,6 @@ #include <io.h> #endif -static int key_cache_used=0; TABLE *unused_tables; /* Used by mysql_test */ HASH open_cache; /* Used by mysql_test */ @@ -550,10 +549,9 @@ bool close_cached_tables(THD *thd, bool if_wait_for_refresh, VOID(hash_delete(&open_cache,(byte*) unused_tables)); #endif } - if (!open_cache.records) + if (!open_cache.records && ! locked_in_memory) { end_key_cache(); /* No tables in memory */ - key_cache_used=0; } refresh_version++; // Force close of open tables } @@ -980,11 +978,8 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, table->key_length=key_length; table->version=refresh_version; table->flush_version=flush_version; - if (!key_cache_used) - { - key_cache_used=1; + if (!key_cache_inited) ha_key_cache(); - } DBUG_PRINT("info", ("inserting table %p into the cache", table)); VOID(hash_insert(&open_cache,(byte*) table)); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 1c506e969f7..059b17c6d84 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -221,6 +221,7 @@ bool select_send::send_data(List<Item> &items) DBUG_RETURN(1); } } + thd->sent_row_count++; bool error=my_net_write(&thd->net,(char*) packet->ptr(),packet->length()); DBUG_RETURN(error); } @@ -256,6 +257,7 @@ select_export::~select_export() (void) my_close(file,MYF(0)); file= -1; } + thd->sent_row_count=row_count; } int @@ -461,10 +463,10 @@ err: void select_export::send_error(uint errcode,const char *err) { - ::send_error(&thd->net,errcode,err); - (void) end_io_cache(&cache); - (void) my_close(file,MYF(0)); - file= -1; + ::send_error(&thd->net,errcode,err); + (void) end_io_cache(&cache); + (void) my_close(file,MYF(0)); + file= -1; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 4389512c1b3..34379baedd6 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -94,8 +94,9 @@ public: void open(const char *log_name,enum_log_type log_type, const char *new_name=0); void new_file(void); - void write(enum enum_server_command command,const char *format,...); - void write(const char *query, uint query_length, ulong time_to_do_query=0); + void write(THD *thd, enum enum_server_command command,const char *format,...); + void write(THD *thd, const char *query, uint query_length, + time_t query_start=0); void write(Query_log_event* event_info); // binary log write void write(Load_log_event* event_info); @@ -111,7 +112,7 @@ public: int find_next_log(LOG_INFO* linfo); int get_current_log(LOG_INFO* linfo); - bool is_open() { return log_type != LOG_CLOSED; } + inline bool is_open() { return log_type != LOG_CLOSED; } char* get_index_fname() { return index_file_name;} char* get_log_fname() { return log_file_name; } }; @@ -241,7 +242,7 @@ public: const char *where; char* last_nx_table; // last non-existent table, we need this for replication char* last_nx_db; // database of the last nx table - time_t start_time; + time_t start_time,time_after_lock; time_t connect_time,thr_create_time; // track down slow pthread_create thr_lock_type update_lock_default; delayed_insert *di; @@ -257,7 +258,7 @@ public: #endif ulonglong next_insert_id,last_insert_id,current_insert_id; ha_rows select_limit,offset_limit,default_select_limit,cuted_fields, - max_join_size; + max_join_size,sent_row_count; ulong query_id,version, inactive_timeout,options,thread_id; long dbug_thread_id; pthread_t real_id; @@ -276,6 +277,7 @@ public: inline time_t query_start() { query_start_used=1; return start_time; } inline void set_time() { if (!user_time) time(&start_time); } inline void set_time(time_t t) { start_time=t; user_time=1; } + inline void lock_time() { time(&time_after_lock); } inline void insert_id(ulonglong id) { last_insert_id=id; insert_id_used=1; } inline ulonglong insert_id(void) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 33c8ee54037..5c816aa8dc5 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -71,9 +71,12 @@ void mysql_create_db(THD *thd, char *db, uint create_options) path); } { - mysql_update_log.write(thd->query, thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } if (thd->query == path) { @@ -131,9 +134,12 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) thd->query_length = (uint) (strxmov(path,"drop database ", db, NullS)- path); } - mysql_update_log.write(thd->query, thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd, thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } if (thd->query == path) { thd->query = 0; // just in case @@ -276,7 +282,7 @@ bool mysql_change_db(THD *thd,const char *name) thd->priv_user, thd->host ? thd->host : thd->ip ? thd->ip : "unknown", dbname); - mysql_log.write(COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR), + mysql_log.write(thd,COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR), thd->priv_user, thd->host ? thd->host : thd->ip ? thd->ip : "unknown", dbname); diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 5d21a089283..05bed157d27 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -89,9 +89,12 @@ static int generate_table(THD *thd, TABLE_LIST *table_list, if (!error) { send_ok(&thd->net); // This should return record count - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } DBUG_RETURN(error ? -1 : 0); } @@ -188,9 +191,12 @@ int mysql_delete(THD *thd,TABLE_LIST *table_list,COND *conds,ha_rows limit, VOID(table->file->extra(HA_EXTRA_READCHECK)); if (deleted) { - mysql_update_log.write(thd->query, thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } if (ha_autocommit_or_rollback(thd,error >= 0)) error=1; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index bd0415aa936..13feba9ab9c 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -246,9 +246,12 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, id=table->next_number_field->val_int(); // Return auto_increment value if (info.copied || info.deleted) { - mysql_update_log.write(thd->query, thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd, thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } error=ha_autocommit_or_rollback(thd,error); if (thd->lock) @@ -1085,9 +1088,12 @@ bool delayed_insert::handle_inserts(void) } if (row->query && row->log_query) { - mysql_update_log.write(row->query, row->query_length); - Query_log_event qinfo(&thd, row->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(&thd,row->query, row->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(&thd, row->query); + mysql_bin_log.write(&qinfo); + } } if (table->blob_fields) free_delayed_insert_blobs(table); @@ -1245,9 +1251,12 @@ bool select_insert::send_eof() if (last_insert_id) thd->insert_id(last_insert_id); // For update log ::send_ok(&thd->net,info.copied,last_insert_id,buff); - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } return 0; } } diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 145bbec4d88..ef64b5e3bfa 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -244,14 +244,14 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, sprintf(name,ER(ER_LOAD_INFO),info.records,info.deleted, info.records-info.copied,thd->cuted_fields); send_ok(&thd->net,info.copied+info.deleted,0L,name); - mysql_update_log.write(thd->query,thd->query_length); + mysql_update_log.write(thd,thd->query,thd->query_length); - if(!read_file_from_client) - { - ex->skip_lines = save_skip_lines; - Load_log_event qinfo(thd, ex, table->table_name, fields, handle_duplicates); - mysql_bin_log.write(&qinfo); - } + if (!read_file_from_client) + { + ex->skip_lines = save_skip_lines; + Load_log_event qinfo(thd, ex, table->table_name, fields, handle_duplicates); + mysql_bin_log.write(&qinfo); + } DBUG_RETURN(0); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 97eb7c80b50..1626f03ed7a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -119,7 +119,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, thd->user, thd->host ? thd->host : thd->ip, passwd[0] ? ER(ER_YES) : ER(ER_NO)); - mysql_log.write(COM_CONNECT,ER(ER_ACCESS_DENIED_ERROR), + mysql_log.write(thd,COM_CONNECT,ER(ER_ACCESS_DENIED_ERROR), thd->user, thd->host ? thd->host : thd->ip ? thd->ip : "unknown ip", passwd[0] ? ER(ER_YES) : ER(ER_NO)); @@ -137,7 +137,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, return(1); } } - mysql_log.write(command, + mysql_log.write(thd,command, (thd->priv_user == thd->user ? (char*) "%s@%s on %s" : (char*) "%s@%s as anonymous on %s"), @@ -578,7 +578,7 @@ bool do_command(THD *thd) switch(command) { case COM_INIT_DB: if (!mysql_change_db(thd,packet+1)) - mysql_log.write(command,"%s",thd->db); + mysql_log.write(thd,command,"%s",thd->db); break; case COM_TABLE_DUMP: { @@ -646,7 +646,7 @@ bool do_command(THD *thd) thd->packet.shrink(net_buffer_length); // Reclaim some memory if (!(specialflag & SPECIAL_NO_PRIOR)) my_pthread_setprio(pthread_self(),QUERY_PRIOR); - mysql_log.write(command,"%s",thd->query); + mysql_log.write(thd,command,"%s",thd->query); DBUG_PRINT("query",("%s",thd->query)); mysql_parse(thd,thd->query,packet_length-1); if (!(specialflag & SPECIAL_NO_PRIOR)) @@ -671,7 +671,7 @@ bool do_command(THD *thd) thd->free_list=0; table_list.name=table_list.real_name=thd->strdup(packet+1); thd->query=fields=thd->strdup(strend(packet+1)+1); - mysql_log.write(command,"%s %s",table_list.real_name,fields); + mysql_log.write(thd,command,"%s %s",table_list.real_name,fields); remove_escape(table_list.real_name); // This can't have wildcards if (check_access(thd,SELECT_ACL,table_list.db,&thd->col_access)) @@ -685,7 +685,7 @@ bool do_command(THD *thd) } #endif case COM_QUIT: - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); net->error=0; // Don't give 'abort' message error=TRUE; // End server break; @@ -695,7 +695,7 @@ bool do_command(THD *thd) char *db=thd->strdup(packet+1); if (check_access(thd,CREATE_ACL,db,0,1)) break; - mysql_log.write(command,packet+1); + mysql_log.write(thd,command,packet+1); mysql_create_db(thd,db,0); break; } @@ -704,7 +704,7 @@ bool do_command(THD *thd) char *db=thd->strdup(packet+1); if (check_access(thd,DROP_ACL,db,0,1)) break; - mysql_log.write(command,db); + mysql_log.write(thd,command,db); mysql_rm_db(thd,db,0); break; } @@ -712,7 +712,7 @@ bool do_command(THD *thd) { if(check_access(thd, FILE_ACL, any_db)) break; - mysql_log.write(command, 0); + mysql_log.write(thd,command, 0); ulong pos; ushort flags; @@ -726,7 +726,7 @@ bool do_command(THD *thd) uint options=(uchar) packet[1]; if (check_access(thd,RELOAD_ACL,any_db)) break; - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); if (reload_acl_and_cache(thd, options, (TABLE_LIST*) 0)) send_error(net,0); else @@ -737,7 +737,7 @@ bool do_command(THD *thd) if (check_access(thd,SHUTDOWN_ACL,any_db)) break; /* purecov: inspected */ DBUG_PRINT("quit",("Got shutdown command")); - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); send_eof(net); #ifdef __WIN__ sleep(1); // must wait after eof() @@ -752,7 +752,7 @@ bool do_command(THD *thd) case COM_STATISTICS: { - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); char buff[200]; ulong uptime = (ulong) (time((time_t*) 0) - start_time); sprintf((char*) buff, @@ -776,7 +776,7 @@ bool do_command(THD *thd) case COM_PROCESS_INFO: if (!thd->priv_user[0] && check_access(thd,PROCESS_ACL,any_db)) break; - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); mysqld_list_processes(thd,thd->master_access & PROCESS_ACL ? NullS : thd->priv_user,0); break; @@ -790,7 +790,7 @@ bool do_command(THD *thd) if (check_access(thd,PROCESS_ACL,any_db)) break; /* purecov: inspected */ mysql_print_status(thd); - mysql_log.write(command,NullS); + mysql_log.write(thd,command,NullS); send_eof(net); break; case COM_SLEEP: @@ -816,8 +816,7 @@ bool do_command(THD *thd) if ((ulong) (thd->start_time - start_of_query) > long_query_time) { long_query_count++; - mysql_slow_log.write(thd->query, thd->query_length, - (ulong) (thd->start_time - start_of_query)); + mysql_slow_log.write(thd, thd->query, thd->query_length, start_of_query); } VOID(pthread_mutex_lock(&LOCK_thread_count)); // For process list thd->proc_info=0; @@ -1625,11 +1624,14 @@ mysql_execute_command(void) res = mysql_table_grant(thd,tables,lex->users_list, lex->columns, lex->grant, lex->sql_command == SQLCOM_REVOKE); if(!res) + { + mysql_update_log.write(thd, thd->query,thd->query_length); + if (mysql_bin_log.is_open()) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); } + } } else { @@ -1643,9 +1645,12 @@ mysql_execute_command(void) lex->sql_command == SQLCOM_REVOKE); if(!res) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd, thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } } break; @@ -1905,6 +1910,7 @@ mysql_init_query(THD *thd) thd->lex.table_list.next= (byte**) &thd->lex.table_list.first; thd->fatal_error=0; // Safety thd->last_insert_id_used=thd->query_start_used=thd->insert_id_used=0; + thd->sent_row_count=0; DBUG_VOID_RETURN; } @@ -2625,37 +2631,23 @@ static int change_master(THD* thd) static void reset_master() { if(!mysql_bin_log.is_open()) - { - my_error(ER_FLUSH_MASTER_BINLOG_CLOSED, MYF(ME_BELL+ME_WAITTANG)); - return; - } + { + my_error(ER_FLUSH_MASTER_BINLOG_CLOSED, MYF(ME_BELL+ME_WAITTANG)); + return; + } LOG_INFO linfo; - - if(mysql_bin_log.find_first_log(&linfo, "")) + if (mysql_bin_log.find_first_log(&linfo, "")) return; for(;;) - { - my_delete(linfo.log_file_name, MYF(MY_WME)); - if(mysql_bin_log.find_next_log(&linfo)) - break; - } - mysql_bin_log.close(1); // exiting close - my_delete(mysql_bin_log.get_index_fname(), MYF(MY_WME)); - - char tmp[FN_REFLEN]; - if (!opt_bin_logname || !opt_bin_logname[0]) { - char hostname[FN_REFLEN]; - if (gethostname(hostname,sizeof(hostname)-4) < 0) - strmov(hostname,"mysql"); - - strnmov(tmp,hostname,FN_REFLEN-5); - strmov(strcend(tmp,'.'),"-bin"); - opt_bin_logname=tmp; + my_delete(linfo.log_file_name, MYF(MY_WME)); + if (mysql_bin_log.find_next_log(&linfo)) + break; } - + mysql_bin_log.close(1); // exiting close + my_delete(mysql_bin_log.get_index_fname(), MYF(MY_WME)); mysql_bin_log.open(opt_bin_logname,LOG_BIN); } diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc index e1be78ada1c..c3acbac1bd2 100644 --- a/sql/sql_rename.cc +++ b/sql/sql_rename.cc @@ -87,9 +87,12 @@ end: } if (!error) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } send_ok(&thd->net); } for (TABLE_LIST *table=table_list ; table != lock_table ; table=table->next) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5a983c8cf06..afd7ebabc53 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -117,9 +117,12 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) } if (some_tables_deleted) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd, thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } VOID(pthread_cond_broadcast(&COND_refresh)); // Signal to refresh @@ -526,9 +529,12 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, if (!tmp_table && !no_log) { // Must be written before unlock - mysql_update_log.write(thd->query, thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } if (create_info->options & HA_LEX_CREATE_TMP_TABLE) { @@ -966,9 +972,12 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, VOID(pthread_mutex_unlock(&LOCK_open)); if (!error) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd, thd->query, thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } send_ok(&thd->net); } @@ -1257,10 +1266,12 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, my_free((gptr) new_table,MYF(0)); goto err; } - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); - + mysql_update_log.write(thd, thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } goto end_temporary; DBUG_RETURN(0); } @@ -1364,7 +1375,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, } thd->proc_info="end"; - mysql_update_log.write(thd->query,thd->query_length); + mysql_update_log.write(thd, thd->query,thd->query_length); + if (mysql_bin_log.is_open()) { Query_log_event qinfo(thd, thd->query); mysql_bin_log.write(&qinfo); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 41f0eb97456..29e9c8b8aac 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -237,9 +237,12 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List<Item> &fields, table->time_stamp=save_time_stamp; // Restore auto timestamp pointer if (updated) { - mysql_update_log.write(thd->query,thd->query_length); - Query_log_event qinfo(thd, thd->query); - mysql_bin_log.write(&qinfo); + mysql_update_log.write(thd,thd->query,thd->query_length); + if (mysql_bin_log.is_open()) + { + Query_log_event qinfo(thd, thd->query); + mysql_bin_log.write(&qinfo); + } } if (ha_autocommit_or_rollback(thd, error >= 0)) error=1; |