summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/manual.texi175
-rw-r--r--include/my_sys.h2
-rw-r--r--myisam/mi_check.c5
-rw-r--r--myisam/myisamchk.c2
-rw-r--r--mysys/my_static.c1
-rw-r--r--mysys/my_symlink2.c6
-rw-r--r--sql/mysqld.cc7
7 files changed, 167 insertions, 31 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index f06280d7f84..664f1861b42 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -686,6 +686,7 @@ System/Compile Time and Startup Parameter Tuning
* Compile and link options:: How compiling and linking affects the speed of MySQL
* Disk issues:: Disk issues
+* Symbolic links::
* Server parameters:: Tuning server parameters
* Table cache:: How MySQL opens and closes tables
* Creating many tables:: Drawbacks of creating large numbers of tables in the same database
@@ -695,9 +696,10 @@ System/Compile Time and Startup Parameter Tuning
* Table locking:: Table locking issues
* DNS::
-Disk Issues
+Using Symbolic Links
-* Symbolic links:: Using symbolic links for databases and tables
+* Symbolic links to database::
+* Symbolic links to tables::
Speed of Queries that Access or Update Data
@@ -10405,9 +10407,8 @@ recommended for systems where only local requests are allowed. @xref{DNS}.
Don't use new, possible wrong routines. Implies @code{--skip-delay-key-write}.
This will also set default table type to @code{ISAM}. @xref{ISAM}.
-@item --skip-stack-trace
-Don't write stack traces. This option is useful when you are running
-@code{mysqld} under a debugger. @xref{Debugging server}.
+@item --skip-symlinks
+Don't delete or rename files that symlinks in the data directory points to.
@item --skip-safemalloc
If @strong{MySQL} is configured with @code{--with-debug=full}, all programs
@@ -10419,6 +10420,10 @@ need memory checking, by using this option.
Don't allow 'SHOW DATABASE' commands, unless the user has @strong{process}
privilege.
+@item --skip-stack-trace
+Don't write stack traces. This option is useful when you are running
+@code{mysqld} under a debugger. @xref{Debugging server}.
+
@item --skip-thread-priority
Disable using thread priorities for faster response time.
@@ -12153,6 +12158,13 @@ Normally this is done with the @code{su} command. For more details, see
@ref{Changing MySQL user, , Changing @strong{MySQL} user}.
@item
+Don't support symlinks to tables (This can be disabled with the
+@code{--skip-symlinks} option. This is especially important if you run
+@code{mysqld} as root as anyone that has write access to the mysqld data
+directories could then delete any file in the system!
+@xref{Symbolic links to tables}.
+
+@item
If you put a password for the Unix @code{root} user in the @code{mysql.server}
script, make sure this script is readable only by @code{root}.
@@ -18807,6 +18819,8 @@ or DELAY_KEY_WRITE = @{0 | 1@}
or ROW_FORMAT= @{ default | dynamic | fixed | compressed @}
or RAID_TYPE= @{1 | STRIPED | RAID0 @} RAID_CHUNKS=# RAID_CHUNKSIZE=#
or UNION = (table_name,[table_name...])
+or DATA DIRECTORY="directory"
+or INDEX DIRECTORY="directory"
select_statement:
[IGNORE | REPLACE] SELECT ... (Some legal select statement)
@@ -19138,6 +19152,14 @@ In the created table the @code{PRIMARY} key will be placed first, followed
by all @code{UNIQUE} keys and then the normal keys. This helps the
@strong{MySQL} optimizer to prioritize which key to use and also more quickly
detect duplicated @code{UNIQUE} keys.
+
+@item
+By using @code{DATA DIRECTORY="directory"} or @code{INDEX
+DIRECTORY="directory"} you can specify where the table handler should
+put it's table and index files. This only works for @code{MyISAM} tables
+in @code{MySQL} 4.0, when you are not using the @code{--skip-symlinks}
+option. @xref{Symbolic links to tables}.
+
@end itemize
@cindex silent column changes
@@ -23608,6 +23630,10 @@ with updates and inserts. This is done by automatically combining adjacent
deleted blocks and by extending blocks if the next block is deleted.
@item
@code{myisampack} can pack @code{BLOB} and @code{VARCHAR} columns.
+@item
+You can use put the datafile and index file on different directories
+to get more speed (with the @code{DATA/INDEX DIRECTORY="path"} option to
+@code{CREATE TABLE}). @xref{CREATE TABLE}.
@end itemize
@code{MyISAM} also supports the following things, which @strong{MySQL}
@@ -29657,6 +29683,11 @@ Replication will be done correctly with @code{AUTO_INCREMENT},
@code{RAND()}. You can, for example, use @code{UNIX_TIMESTAMP()} for the
argument to @code{RAND()}.
@item
+You have to use the same character set (@code{--default-character-set})
+on the master and the slave. If not, you may get duplicate key errors on
+the slave, because a key that is regarded as unique on the master may
+not be that in the other character set.
+@item
@code{LOAD DATA INFILE} will be handled properly as long as the file
still resides on the master server at the time of update
propagation. @code{LOAD LOCAL DATA INFILE} will be skipped.
@@ -30765,6 +30796,7 @@ are using @code{--skip-locking}
@menu
* Compile and link options:: How compiling and linking affects the speed of MySQL
* Disk issues:: Disk issues
+* Symbolic links:: Using Symbolic Links
* Server parameters:: Tuning server parameters
* Table cache:: How MySQL opens and closes tables
* Creating many tables:: Drawbacks of creating large numbers of tables in the same database
@@ -30877,7 +30909,7 @@ Linux binary is linked statically to get it faster and more portable.
@cindex disk issues
@cindex performance, disk issues
-@node Disk issues, Server parameters, Compile and link options, System
+@node Disk issues, Symbolic links, Compile and link options, System
@subsection Disk Issues
@itemize @bullet
@@ -30955,31 +30987,40 @@ really useful on a database server), you can mount your file systems
with the noatime flag.
@end itemize
-@menu
-* Symbolic links:: Using symbolic links for databases and tables
-@end menu
-
@cindex symbolic links
@cindex links, symbolic
-@cindex databases, symbolic links
-@cindex tables, symbolic links
-@node Symbolic links, , Disk issues, Disk issues
-@subsubsection Using Symbolic Links for Databases and Tables
+@node Symbolic links, Server parameters, Disk issues, System
+@subsection Using Symbolic Links
You can move tables and databases from the database directory to other
locations and replace them with symbolic links to the new locations.
You might want to do this, for example, to move a database to a file
-system with more free space.
+system with more free space or increase the speed of your system by
+spreading your tables to different disk.
+
+The recommended may to do this, is to just symlink databases to different
+disk and only symlink tables as a last resort.
+.
+
+@cindex databases, symbolic links
+@menu
+* Symbolic links to database::
+* Symbolic links to tables::
+@end menu
-If @strong{MySQL} notices that a table is symbolically linked, it will
-resolve the symlink and use the table it points to instead. This works
-on all systems that support the @code{realpath()} call (at least Linux
-and Solaris support @code{realpath()})! On systems that don't support
-@code{realpath()}, you should not access the table through the real path
-and through the symlink at the same time! If you do, the table will be
-inconsistent after any update.
+@node Symbolic links to database, Symbolic links to tables, Symbolic links, Symbolic links
+@subsubsection Using Symbolic Links for Databases
-@strong{MySQL} doesn't that you link one directory to multiple
+The way to symlink a database is to first create a directory on some
+disk where you have free space and then create a symlink to it from
+the @strong{MySQL} database directory.
+
+@example
+shell> mkdir /dr1/databases/test
+shell> ln -s /dr1/databases/test mysqld-datadir
+@end example
+
+@strong{MySQL} doesn't support that you link one directory to multiple
databases. Replacing a database directory with a symbolic link will
work fine as long as you don't make a symbolic link between databases.
Suppose you have a database @code{db1} under the @strong{MySQL} data
@@ -31011,11 +31052,82 @@ On Windows you can use internal symbolic links to directories by compiling
@strong{MySQL} with @code{-DUSE_SYMDIR}. This allows you to put different
databases on different disks. @xref{Windows symbolic links}.
+@cindex databases, symbolic links
+@node Symbolic links to tables, , Symbolic links to database, Symbolic links
+@subsubsection Using Symbolic Links for Tables
+
+Before @strong{MySQL} 4.0 you should not symlink tables, if you are not
+very carefully with them. The problem is that if you run @code{ALTER
+TABLE}, @code{REPAIR TABLE} or @code{OPTIMIZE TABLE} on a symlinked
+table, the symlinks will be removed and replaced by the original
+files. This happens because the above command works by creating a
+temporary file in the database directory and when the command is
+complete, replace the original file with the temporary file.
+
+You should not symlink tables on system that doesn't have a fully
+working @code{realpath()} call. (At least Linux and Solaris support
+@code{realpath()})
+
+In @strong{MySQL} 4.0 symlinks is only fully supported for @code{MyISAM}
+tables. For other table types you will probably get strange problems
+when doing any of the above mentioned commands.
+
+The handling of symbolic links in @strong{MySQL} 4.0 works the following
+way (this is mostly relevant only for @code{MyISAM} tables).
+
+@itemize @bullet
+@item
+In the data directory you will always have the table definition file
+and the data/index files.
+@item
+You can symlink the index file and the data file to different directories
+independent of the other.
+@item
+The symlinking can be done from the operating system (if @code{mysqld} is
+not running) or with the @code{INDEX/DATA DIRECTORY="path-to-dir"} command
+in @code{CREATE TABLE}. @xref{CREATE TABLE}.
+@item
+@code{myisamchk} will not replace a symlink with the index/file but
+work directly on the files the symlinks points to. Any temporary files
+will be created in the same directory where the data/index file is.
+@item
+When you drop a table that is using symlinks, both the symlink and the
+file the symlink points to is dropped. This is a good reason to why you
+should NOT run @code{mysqld} as root and not allow persons to have write
+access to the @strong{MySQL} database directories.
+@item
+If you rename a table with @code{ALTER TABLE RENAME} and you don't change
+database, the symlink in the database directory will be renamed to the new
+name and the data/index file will be renamed accordingly.
+@item
+If you use @code{ALTER TABLE RENAME} to move a table to another database,
+then the table will be moved to the other database directory and the old
+symlinks and the files they pointed to will be deleted.
+@item
+If you are not using symlinks you should use the @code{--skip-symlinks}
+option to @code{mysqld} to ensure that no one can drop or rename a file
+outside of the @code{mysqld} data directory.
+@end itemize
+
+Things that are not yet fully supported:
+
+@cindex TODO, symlinks
+@itemize @bullet
+@item
+@code{ALTER TABLE} ignores all @code{INDEX/DATA DIRECTORY="path"} options.
+@item
+@code{CREATE TABLE} doesn't report if the table has symbolic links.
+@item
+@code{mysqldump} doesn't include the symbolic links information in the output.
+@item
+@code{BACKUP TABLE} and @code{RESTORE TABLE} doesn't use symbolic links.
+@end itemize
+
@cindex parameters, server
@cindex @code{mysqld} server, buffer sizes
@cindex buffer sizes, @code{mysqld} server
@cindex startup parameters
-@node Server parameters, Table cache, Disk issues, System
+@node Server parameters, Table cache, Symbolic links, System
@subsection Tuning Server Parameters
You can get the default buffer sizes used by the @code{mysqld} server
@@ -38783,6 +38895,12 @@ Post the test file using @code{mysqlbug} to @email{mysql@@lists.mysql.com}.
@node ALTER TABLE problems, Change column order, No matching rows, Problems
@section Problems with @code{ALTER TABLE}.
+@code{ALTER TABLE} changes a table to the current character set.
+If you during @code{ALTER TABLE} get a duplicate key error, then the cause
+is either that the new character sets maps to keys to the same value
+or that the table is corrupted, in which case you should run
+@code{REPAIR TABLE} on the table.
+
If @code{ALTER TABLE} dies with an error like this:
@example
@@ -45498,6 +45616,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet
@item
+Added support for symbolic links to @code{MyISAM} tables.
+@item
Added @code{SQL_CALC_FOUND_ROWS} and @code{FOUND_ROWS()}. This makes it
possible to know how many rows a query would have returned
without a @code{LIMIT} clause.
@@ -45512,8 +45632,6 @@ Added @code{ORDER BY} syntax to @code{UPDATE} and @code{DELETE}.
@item
Optimized queries of type:
@code{SELECT DISTINCT * from table_name ORDER by key_part1 LIMIT #}
-@item
-Added support for sym-linking of MyISAM tables.
@end itemize
@node News-3.23.x, News-3.22.x, News-4.0.x, News
@@ -45607,6 +45725,11 @@ not yet 100% confident in this code.
@appendixsubsec Changes in release 3.23.39
@itemize @bullet
@item
+Running @code{myisamchk --fast --force} will not anymore repair tables
+that only had the open count wrong.
+@item
+Added functions to handle symbolic links to make life easier in 4.0.
+@item
We are now using the @code{-lcma} thread library on HPUX 10.20 to
get @strong{MySQL} more stabile on HPUX.
@item
diff --git a/include/my_sys.h b/include/my_sys.h
index d4b9ed8b54b..42f332bcee7 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -208,7 +208,7 @@ extern long lCurMemory,lMaxMemory; /* from safemalloc */
extern ulong my_default_record_cache_size;
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
- NEAR my_disable_flush_key_blocks;
+ NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
extern char wild_many,wild_one,wild_prefix;
extern const char *charsets_dir;
extern char *defaults_extra_file;
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 64fbafca022..c6e07445bcf 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -110,9 +110,14 @@ int chk_status(MI_CHECK *param, register MI_INFO *info)
"Table is marked as crashed");
if (share->state.open_count != (uint) (info->s->global_changed ? 1 : 0))
{
+ /* Don't count this as a real warning, as check can correct this ! */
+ uint save=param->warning_printed;
mi_check_print_warning(param,
"%d clients is using or hasn't closed the table properly",
share->state.open_count);
+ /* If this will be fixed by the check, forget the warning */
+ if (param->testflag & T_UPDATE_STATE)
+ param->warning_printed=save;
}
return 0;
}
diff --git a/myisam/myisamchk.c b/myisam/myisamchk.c
index cbdd6a26767..06d34c10659 100644
--- a/myisam/myisamchk.c
+++ b/myisam/myisamchk.c
@@ -201,7 +201,7 @@ static struct option long_options[] =
static void print_version(void)
{
- printf("%s Ver 1.45 for %s at %s\n",my_progname,SYSTEM_TYPE,
+ printf("%s Ver 1.46 for %s at %s\n",my_progname,SYSTEM_TYPE,
MACHINE_TYPE);
}
diff --git a/mysys/my_static.c b/mysys/my_static.c
index f1339877273..3fc68455841 100644
--- a/mysys/my_static.c
+++ b/mysys/my_static.c
@@ -97,4 +97,5 @@ int (*fatal_error_handler_hook)(uint error,const char *str,myf MyFlags)=
my_bool NEAR my_disable_locking=0;
my_bool NEAR my_disable_async_io=0;
my_bool NEAR my_disable_flush_key_blocks=0;
+my_bool NEAR my_disable_symlinks=0;
my_bool NEAR mysys_uses_curses=0;
diff --git a/mysys/my_symlink2.c b/mysys/my_symlink2.c
index 671531393f7..9fcd993ac1f 100644
--- a/mysys/my_symlink2.c
+++ b/mysys/my_symlink2.c
@@ -62,7 +62,8 @@ File my_create_with_symlink(const char *linkname, const char *filename,
int my_delete_with_symlink(const char *name, myf MyFlags)
{
char link_name[FN_REFLEN];
- int was_symlink= !my_readlink(link_name, name, MYF(0));
+ int was_symlink= (!my_disable_symlinks &&
+ !my_readlink(link_name, name, MYF(0)));
int result;
DBUG_ENTER("my_delete_with_symlink");
@@ -90,7 +91,8 @@ int my_rename_with_symlink(const char *from, const char *to, myf MyFlags)
return my_rename(from, to, MyFlags);
#else
char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
- int was_symlink= !my_readlink(link_name, name, MYF(0));
+ int was_symlink= (!my_disable_symlinks &&
+ !my_readlink(link_name, name, MYF(0)));
int result;
DBUG_ENTER("my_rename_with_symlink");
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index b009387f5c0..5f007610a14 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2462,7 +2462,7 @@ enum options {
OPT_TEMP_POOL, OPT_TX_ISOLATION,
OPT_GEMINI_FLUSH_LOG, OPT_GEMINI_RECOVER,
OPT_GEMINI_UNBUFFERED_IO, OPT_SKIP_SAFEMALLOC,
- OPT_SKIP_STACK_TRACE
+ OPT_SKIP_STACK_TRACE, OPT_SKIP_SYMLINKS
};
static struct option long_options[] = {
@@ -2588,6 +2588,7 @@ static struct option long_options[] = {
{"skip-show-database", no_argument, 0, (int) OPT_SKIP_SHOW_DB},
{"skip-slave-start", no_argument, 0, (int) OPT_SKIP_SLAVE_START},
{"skip-stack-trace", no_argument, 0, (int) OPT_SKIP_STACK_TRACE},
+ {"skip-symlinks", no_argument, 0, (int) OPT_SKIP_SYMLINKS},
{"skip-thread-priority", no_argument, 0, (int) OPT_SKIP_PRIOR},
{"sql-bin-update-same", no_argument, 0, (int) OPT_SQL_BIN_UPDATE_SAME},
#include "sslopt-longopts.h"
@@ -3420,6 +3421,7 @@ static void get_options(int argc,char **argv)
myisam_delay_key_write=0;
myisam_concurrent_insert=0;
myisam_recover_options= HA_RECOVER_NONE;
+ my_disable_symlinks=1;
ha_open_options&= ~HA_OPEN_ABORT_IF_CRASHED;
break;
case (int) OPT_SAFE:
@@ -3476,6 +3478,9 @@ static void get_options(int argc,char **argv)
case (int) OPT_SKIP_STACK_TRACE:
test_flags|=TEST_NO_STACKTRACE;
break;
+ case (int) OPT_SKIP_SYMLINKS:
+ my_disable_symlinks=1;
+ break;
case (int) OPT_BIND_ADDRESS:
if (optarg && isdigit(optarg[0]))
{