manual.txt
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1762k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. We are interested in finding someone to do a port, and we will help them
  2. with any techincal questions they may have while doing the port.
  3. We have previously talked with some BeOS developers that have said that
  4. *MySQL* is 80% ported to BeOS, but we haven't heard from these in a
  5. while.
  6. Windows Notes
  7. =============
  8. This section describes installation and use of *MySQL* on Windows.  This
  9. is also described in the `README' file that comes with the *MySQL*
  10. Windows distribution.
  11. Installing MySQL on Windows
  12. ---------------------------
  13. If you don't have a copy of the MySQL distribution, you should first
  14. download one from `http://www.mysql.com/'.
  15. If you plan to connect to *MySQL* from some other program, you will
  16. probably also need the *MyODBC* driver. You can find this at the
  17. *MyODBC* download page
  18. (`http://www.mysql.com/downloads/api-myodbc.html').
  19. To install either distribution, unzip it in some empty directory and
  20. run the `Setup.exe' program.
  21. By default, *MySQL*-Windows is configured to be installed in
  22. `C:mysql'.  If you want to install *MySQL* elsewhere, install it in
  23. `C:mysql', then move the installation to where you want it.  If you do
  24. move *MySQL*, you must tell `mysqld' where everything is by supplying
  25. options to `mysqld'. Use `C:mysqlbinmysqld --help' to display all
  26. options!  For example, if you have moved the *MySQL* distribution to
  27. `D:programsmysql', you must start `mysqld' with:
  28. `D:programsmysqlbinmysqld --basedir D:programsmysql'
  29. With all newer *MySQL* versions, you can also create a `C:my.cnf' file
  30. that holds any default options for the *MySQL* server.  Copy the file
  31. `mysqlmy-xxxxx.cnf' to `C:my.cnf' and edit this to suit your setup.
  32. Note that you should specify all paths with `/' instead of `'. If you
  33. use `', you need to specify this twice, as `' is the escape character
  34. in *MySQL*.  *Note Option files::.
  35. Starting MySQL on Windows 95 or Windows 98
  36. ------------------------------------------
  37. *MySQL* uses TCP/IP to connect a client to a server. (This will allow
  38. any machine on your network to connect to your *MySQL* server.) Because
  39. of this, you must install TCP/IP on your machine before starting
  40. *MySQL*.  You can find TCP/IP on your Windows CD-ROM.
  41. Note that if you are using an old Win95 release (for example OSR2), it's
  42. likely that you have an old Winsock package!  *MySQL* requires Winsock
  43. 2!  You can get the newest Winsock from Microsoft
  44. (http://www.microsoft.com).  Win98 has as default the new Winsock 2
  45. library, so the above doesn't apply for Win98.
  46. There are 2 different *MySQL* servers you can use:
  47. `mysqld'           Compiled with full debugging and automatic memory
  48.                    allocation checking
  49. `mysqld-opt'       Optimized for a Pentium processor.
  50. Both of the above should work on any Intel processor >= i386.
  51. To start the `mysqld' server, you should start an MS-DOS window and
  52. type:
  53.      C:mysqlbinmysqld
  54. This will start `mysqld' in the background without a window.
  55. You can kill the *MySQL* server by executing:
  56.      C:mysqlbinmysqladmin -u root shutdown
  57. Note that Win95/Win98 don't support creation of named pipes.  On
  58. Win95/Win98, you can only use named pipes to connect to a remote
  59. *MySQL* running on an NT server.
  60. If `mysqld' doesn't start, please check whether or not the
  61. `mysqlmysql.err' file contains any reason for this.  You can also try
  62. to start it with `mysqld --standalone';  In this case you may get some
  63. useful information on the screen that may help solve this.
  64. The last option is to start `mysqld' with `--debug'.  In this case
  65. `mysqld' will write a log file in `mysqld.trace' that should contain
  66. the reason why `mysqld' doesn't start.  If you make a bug report about
  67. this, please only send the lines  to the mailing list where something
  68. seems to go wrong!
  69. Starting MySQL on NT or Windows 2000
  70. ------------------------------------
  71. The Win95/Win98 section also applies to *MySQL* on NT/Win2000, with the
  72. following differences:
  73. To get *MySQL* to work with TCP/IP on NT, you must install service pack
  74. 3 (or newer)!
  75. Note that everything in the following that applies for NT also applies
  76. for Win2000!
  77. For NT/Win2000, the server name is `mysqld-nt'.  Normally you should
  78. install *MySQL* as a service on NT/Win2000:
  79.      C:mysqlbinmysqld-nt --install
  80. (You could use the `mysqld' or `mysqld-opt' servers on NT, but those
  81. cannot be started as a service or use named pipes.)
  82. You can start and stop the *MySQL* service with:
  83.      NET START mysql
  84.      NET STOP mysql
  85. Note that in this case you can't use any other options for `mysqld-nt'!
  86. You can also run `mysqld-nt' as a stand-alone program on NT if you need
  87. to start `mysqld-nt' with any options!  If you start `mysqld-nt'
  88. without options on NT, `mysqld-nt' tries to starts itself as a service
  89. with the default service options.  If you have stopped `mysqld-nt', you
  90. have to start it with `NET START mysql'.
  91. The service is installed with the name `MySql'. Once installed, it must
  92. be started using the Services Control Manager (SCM) Utility (found in
  93. Control Panel) or by using the `NET START MySQL' command. If any
  94. options are desired, they must be specified as "Startup parameters" in
  95. the SCM utility before you start the *MySQL* service.  Once running,
  96. `mysqld-nt' can be stopped using `mysqladmin' or from the SCM utility
  97. or by using the command `NET STOP MySQL'. If you use SCM to stop
  98. `mysqld-nt', there is a strange message from SCM about `mysqld shutdown
  99. normally'.  When run as a service, `mysqld-nt' has no access to a
  100. console and so no messages can be seen.
  101. On NT you can get the following service error messages:
  102. Permission Denied      Means that it cannot find `mysqld-nt.exe'.
  103. Cannot Register        Means that the path is incorrect.
  104. Failed to install      Means that the service is already installed or
  105. service.               that the Service Control Manager is in bad state.
  106. If you have problems installing `mysqld-nt' as a service, try starting
  107. it with the full path:
  108.      C:mysqlbinmysqld-nt --install
  109. If this doesn't work, you can get `mysqld-nt' to start properly by
  110. fixing the path in the registry!
  111. If you don't want to start `mysqld-nt' as a service, you can start it as
  112. follows:
  113.      C:mysqlbinmysqld-nt --standalone
  114. or
  115.      C:mysqlbinmysqld --standalone --debug
  116. The last version gives you a debug trace in `C:mysqld.trace'.
  117. Running MySQL on Windows
  118. ------------------------
  119. *MySQL* supports TCP/IP on all Windows platforms and named pipes on NT.
  120. The default is to use named pipes for local connections on NT and
  121. TCP/IP for all other cases if the client has TCP/IP installed.  The
  122. host name specifies which protocol is used:
  123. *Host name* *Protocol*             
  124. NULL (none)            On NT, try named pipes first; if that doesn't
  125.                        work, use TCP/IP. On Win95/Win98, TCP/IP is used.
  126. .                      Named pipes
  127. localhost              TCP/IP to current host
  128. hostname               TCP/IP
  129. You can force a *MySQL* client to use named pipes by specifying the
  130. `--pipe' option or by specifying `.' as the host name.   Use the
  131. `--socket' option to specify the name of the pipe.
  132. You can test whether or not *MySQL* is working by executing the
  133. following commands:
  134.      C:mysqlbinmysqlshow
  135.      C:mysqlbinmysqlshow -u root mysql
  136.      C:mysqlbinmysqladmin version status proc
  137.      C:mysqlbinmysql test
  138. If `mysqld' is slow to answer to connections on Win95/Win98, there is
  139. probably a problem with your DNS. In this case, start `mysqld' with
  140. `--skip-name-resolve' and use only `localhost' and IP numbers in the
  141. *MySQL* grant tables.  You can also avoid DNS when connecting to a
  142. `mysqld-nt' *MySQL* server running on NT by using the `--pipe' argument
  143. to specify use of named pipes.  This works for most *MySQL* clients.
  144. There are two versions of the *MySQL* command-line tool:
  145. `mysql'            Compiled on native Windows, which offers very limited
  146.                    text editing capabilities.
  147. `mysqlc'           Compiled with the Cygnus GNU compiler and libraries,
  148.                    which offers `readline' editing.
  149. If you want to use `mysqlc.exe', you must copy
  150. `C:mysqllibcygwinb19.dll' to `windowssystem' (or similar place).
  151. The default privileges on Windows give all local users full privileges
  152. to all databases.  To make *MySQL* more secure, you should set a
  153. password for all users and remove the row in the `mysql.user' table
  154. that has `Host='localhost'' and `User='''.
  155. You should also add a password for the `root' user.  (The following
  156. example starts by removing the anonymous user, that allows anyone to
  157. access the 'test' database.):
  158.      C:mysqlbinmysql mysql
  159.      mysql> DELETE FROM user WHERE Host='localhost' AND User='';
  160.      mysql> QUIT
  161.      C:mysqlbinmysqladmin reload
  162.      C:mysqlbinmysqladmin -u root password your_password
  163. After you've set the password, if you want to take down the `mysqld'
  164. server, you can do so using this command:
  165.      mysqladmin --user=root --password=your_password shutdown
  166. If you are using the old shareware version of *MySQL* Version 3.21
  167. under Windows, the above command will fail with an error: `parse error
  168. near 'SET OPTION password''.  This is because the old shareware version,
  169. which is based on *MySQL* Version 3.21, doesn't have the `SET PASSWORD'
  170. command.  The fix is in this case to upgrade to the Version 3.22
  171. shareware.
  172. With the newer *MySQL* versions you can easily add new users and change
  173. privileges with `GRANT' and `REVOKE' commands.  *Note GRANT::.
  174. Connecting to a Remote MySQL from Windows with SSH
  175. --------------------------------------------------
  176. Here is a note about how to connect to get a secure connection to
  177. remote MySQL server with SSH (by David Carlson <dcarlson@mplcomm.com>):
  178.    * Install an SSH client on your windows machine - As a user, the
  179.      best non-free one I've found is from `secureCRT' from
  180.      `http://www.vandyke.com/'.  Another option is `f-secure' from
  181.      `http://www.f-secure.com/'. You can also find some free ones on
  182.      *Google* at
  183.      `http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/Clients/Windows/'.
  184.    * Start your windows SSH client. Set `Host_Name =
  185.      yourmysqlserver_URL_or_IP'. Set `userid=your_userid' to log in to
  186.      your server (probably not the same as your *MySQL* login/ password.
  187.    * Set up port forwarding. Either do a remote forward (Set
  188.      `local_port: 3306', `remote_host: yourmysqlservername_or_ip',
  189.      `remote_port: 3306' ) or a local forward (Set `port: 3306',
  190.      `host: localhost', `remote port: 3306').
  191.    * Save everything, otherwise you'll have to redo it the next time.
  192.    * Log in to your server with SSH session you just created.
  193.    * Start some ODBC application on your windows machine (for example
  194.      Access).
  195.    * Create a new file in windows and link to *MySQL* using the ODBC
  196.      driver the same way you normally do, EXCEPT type in `localhost'
  197.      for the *MySQL* host server - not `yourmysqlservername'.
  198. You should now have your ODBC connection to *MySQL* encrypted using SSH.
  199. Splitting Data Across Different Disks Under Windows
  200. ---------------------------------------------------
  201. On windows *MySQL* Version 3.23.16 and above is compiled with the
  202. `-DUSE_SYMDIR' option.  This allows you to put a database on different
  203. disk by adding a symbolic link to it (in a similar manner that symbolic
  204. links works on Unix).
  205. On windows you make a symbolic link to a database by creating a file
  206. that contains the path to the destination directory and saving this in
  207. the `mysql_data' directory under the filename `database.sym'.  Note
  208. that the symbolic link will only be used if the directory
  209. `mysql_data_dirdatabase' doesn't exist.
  210. For example, if you want to have database `foo' on `D:datafoo', you
  211. should create the file `C:mysqldatafoo.sym' that contains the text
  212. `D:datafoo'.  After this, all tables created in the database `foo'
  213. will be created in `D:datafoo'.
  214. Compiling MySQL Clients on Windows
  215. ----------------------------------
  216. In your source files, you should include `windows.h' before you include
  217. `mysql.h':
  218.      #if defined(_WIN32) || defined(_WIN64)
  219.      #include <windows.h>
  220.      #endif
  221.      #include <mysql.h>
  222. You can either link your code with the dynamic `libmysql.lib' library,
  223. which is just a wrapper to load in `libmysql.dll' on demand, or link
  224. with the static `mysqlclient.lib' library.
  225. Note that as the mysqlclient libraries are compiled as threaded
  226. libraries, you should also compile your code to be multi-threaded!
  227. Windows and BDB Tables
  228. ----------------------
  229. We will shortly do a full test on the new BDB interface on Windows.
  230. When this is done we will start to release binary distributions (for
  231. Windows and Unix) of *MySQL* that will include support for BDB tables.
  232. MySQL-Windows Compared to Unix MySQL
  233. ------------------------------------
  234. *MySQL*-Windows has by now proven itself to be very stable. This version
  235. of *MySQL* has the same features as the corresponding Unix version with
  236. the following exceptions:
  237. *Win95 and threads*
  238.      Win95 leaks about 200 bytes of main memory for each thread
  239.      creation.  Because of this, you shouldn't run `mysqld' for an
  240.      extended time on Win95 if you do many connections, because each
  241.      connection in *MySQL* creates a new thread!  WinNT and Win98 don't
  242.      suffer from this bug.
  243. *Concurrent reads*
  244.      *MySQL* depends on the `pread()' and `pwrite()' calls to be able
  245.      to mix `INSERT' and `SELECT'. Currently we use mutexes to emulate
  246.      `pread()'/`pwrite()'.  We will, in the long run, replace the file
  247.      level interface with a virtual interface so that we can use the
  248.      `readfile()'/`writefile()' interface on NT to get more speed.  The
  249.      current implementation will however limit the number of open files
  250.      *MySQL* can use to 1024, which means that you will not be able to
  251.      run as many concurrent threads on NT as on Unix.
  252. *Blocking read*
  253.      *MySQL* uses a blocking read for each connection.  This means that:
  254.         * A connection will not be disconnected automatically after 8
  255.           hours, as happens with the Unix version of *MySQL*.
  256.         * If a connection hangs, it's impossible to break it without
  257.           killing *MySQL*.
  258.         * `mysqladmin kill' will not work on a sleeping connection.
  259.         * `mysqladmin shutdown' can't abort as long as there are
  260.           sleeping connections.
  261.      We plan to fix this when our windows developers have figured out a
  262.      nice workaround for this.
  263. *UDF functions*
  264.      For the moment, *MySQL*-Windows does not support user-definable
  265.      functions.
  266. *`DROP DATABASE'*
  267.      You can't drop a database that is in use by some thread.
  268. *Killing *MySQL* from the task manager*
  269.      You can't kill *MySQL* from the task manager or with the shutdown
  270.      utility in Win95. You must take it down with `mysqladmin shutdown'.
  271. *Case-insensitive names*
  272.      Filenames are case insensitive on Windows, so database and table
  273.      names are also case insensitive in *MySQL* for Windows.  The only
  274.      restriction is that database and table names must be given in the
  275.      same case throughout a given statement.  *Note Name case
  276.      sensitivity::.
  277. *The `' directory character*
  278.      Pathname components in Win95 are separated by the `' character,
  279.      which is also the escape character in *MySQL*.  If you are using
  280.      `LOAD DATA INFILE' or `SELECT ... INTO OUTFILE', you must double
  281.      the `' character or use Unix style filenames `/' characters:
  282.           LOAD DATA INFILE "C:\tmp\skr.txt" INTO TABLE skr;
  283.           SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
  284. *`Can't open named pipe' error*
  285.      If you use a MySQL 3.22 version on NT with the newest
  286.      mysql-clients you will get the following error:
  287.           error 2017: can't open named pipe to host: . pipe...
  288.      This is because the release version of *MySQL* uses named pipes on
  289.      NT by default.  You can avoid this error by using the
  290.      `--host=localhost' option to the new *MySQL* clients or create a
  291.      file `C:my.cnf' that contains the following information:
  292.           [client]
  293.           host = localhost
  294. *`Access denied for user' error*
  295.      If you get the error `Access denied for user: 'some-user@unknown'
  296.      to database 'mysql'' when accessing a *MySQL* server on the same
  297.      machine, this means that *MySQL* can't resolve your host name
  298.      properly.
  299.      To fix this, you should create a file `windowshosts' with the
  300.      following information:
  301.           127.0.0.1       localhost
  302. *`ALTER TABLE'*
  303.      While you are doing an `ALTER TABLE' the table is locked from usage
  304.      by other threads. This has to do with the fact that you on Windows
  305.      can't delete a file that is in use by another threads. (We may in
  306.      the future find some way to go around this problem).
  307. *`DROP TABLE' on a table that is in use by a `MERGE' table will not work.*
  308.      The `MERGE' handler does it table mapping hidden from *MySQL*.
  309.      Because windows doesn't allow one to drop files that are open, you
  310.      have to first flush all `MERGE' tables (with `FLUSH TABLES') or
  311.      drop the `MERGE' table before drooping the table.  We will fix
  312.      this at the same time we introduce `VIEW''s.
  313. Here are some open issues for anyone who might want to help us with the
  314. Windows release:
  315.    * Make a single-user `MYSQL.DLL' server.  This should include
  316.      everything in a standard *MySQL* server, except thread creation.
  317.      This will make *MySQL* much easier to use in applications that
  318.      don't need a true client/server and don't need to access the
  319.      server from other hosts.
  320.    * Add some nice start and shutdown icons to the *MySQL* installation.
  321.    * Create a tool to manage registry entries for the *MySQL* startup
  322.      options.  The registry entry reading is already coded into
  323.      `mysqld.cc', but it should be recoded to be more parameter
  324.      oriented.  The tool should also be able to update the `my.cnf'
  325.      file if the user prefers to use this instead of the registry.
  326.    * When registering `mysqld' as a service with `--install' (on NT) it
  327.      would be nice if you could also add default options on the command
  328.      line.  For the moment, the workaround is to update the `C:my.cnf'
  329.      file instead.
  330.    * When you suspend a laptop running Win95, the `mysqld' daemon
  331.      doesn't accept new connections when the laptop is resumed.  We
  332.      don't know if this is a problem with Win95, TCP/IP, or *MySQL*.
  333.    * It would be real nice to be able to kill `mysqld' from the task
  334.      manager.  For the moment, you must use `mysqladmin shutdown'.
  335.    * Port `readline' to Windows for use in the `mysql' command line
  336.      tool.
  337.    * GUI versions of the standard *MySQL* clients (`mysql',
  338.      `mysqlshow', `mysqladmin', and `mysqldump') would be nice.
  339.    * It would be nice if the socket read and write functions in `net.c'
  340.      were interruptible. This would make it possible to kill open
  341.      threads with `mysqladmin kill' on Windows.
  342.    * Documentation of which Windows programs work with
  343.      *MySQL*-Windows/*MyODBC* and what must be done to get them working.
  344.    * `mysqld' always starts in the "C" locale and not in the default
  345.      locale.  We would like to have `mysqld' use the current locale for
  346.      the sort order.
  347.    * Implement UDF functions with `.DLL's.
  348.    * Add macros to use the faster thread-safe increment/decrement
  349.      methods provided by Windows.
  350. Other Windows-specific issues are described in the `README' file that
  351. comes with the *MySQL*-Windows distribution.
  352. OS/2 Notes
  353. ==========
  354. *MySQL* uses quite a few open files. Because of this, you should add
  355. something like the following to your `CONFIG.SYS' file:
  356.      SET EMXOPT=-c -n -h1024
  357. If you don't do this, you will probably run into the following error:
  358.      File 'xxxx' not found (Errcode: 24)
  359. When using *MySQL* with OS/2 Warp 3, FixPack 29 or above is required.
  360. With OS/2 Warp 4, FixPack 4 or above is required. This is a requirement
  361. of the Pthreads library.  *MySQL* must be installed in a partition that
  362. supports long filenames such as HPFS, FAT32, etc.
  363. The `INSTALL.CMD' script must be run from OS/2's own `CMD.EXE' and may
  364. not work with replacement shells such as `4OS2.EXE'.
  365. The `scripts/mysql-install-db' script has been renamed. It is now called
  366. `install.cmd' and is a REXX script, which will set up the default
  367. *MySQL* security settings and create the WorkPlace Shell icons for
  368. *MySQL*.
  369. Dynamic module support is compiled in but not fully tested. Dynamic
  370. modules should be compiled using the Pthreads run-time library.
  371.      gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. 
  372.          -o example udf_example.cc -L../lib -lmysqlclient udf_example.def
  373.      mv example.dll example.udf
  374. *Note:* Due to limitations in OS/2, UDF module name stems must not
  375. exceed 8 characters. Modules are stored in the `/mysql2/udf' directory;
  376. the `safe-mysqld.cmd' script will put this directory in the
  377. `BEGINLIBPATH' environment variable. When using UDF modules, specified
  378. extensions are ignored -- it is assumed to be `.udf'.  For example, in
  379. Unix, the shared module might be named `example.so' and you would load
  380. a function from it like this:
  381.      CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
  382. Is OS/2, the module would be named `example.udf', but you would not
  383. specify the module extension:
  384.      CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
  385. MySQL Binaries
  386. ==============
  387. As a service, we at MySQL AB provides a set of binary distributions of
  388. *MySQL* that are compiled at our site or at sites where customers
  389. kindly have given us access to their machines.
  390. These distributions are generated with
  391. `scripts/make_binary_distribution' and are configured with the
  392. following compilers and options:
  393. SunOS 4.1.4 2 sun4c with `gcc' 2.7.2.1
  394.      `CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure
  395.      --prefix=/usr/local/mysql --disable-shared
  396.      --with-extra-charsets=complex --enable-assembler'
  397. SunOS 5.5.1 sun4u with `egcs' 1.0.3a
  398.      `CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6
  399.      -fomit-frame-pointer -felide-constructors -fno-exceptions
  400.      -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory
  401.      --with-extra-charsets=complex'
  402. SunOS 5.6 sun4u with `egcs' 2.90.27
  403.      `CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6
  404.      -fomit-frame-pointer -felide-constructors -fno-exceptions
  405.      -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory
  406.      --with-extra-charsets=complex'
  407. SunOS 5.6 i86pc with `gcc' 2.8.1
  408.      `CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
  409.      --with-low-memory --with-extra-charsets=complex'
  410. Linux 2.0.33 i386 with `pgcc' 2.90.29 (`egcs' 1.0.3a)
  411.      `CFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer"
  412.      CXX=gcc CXXFLAGS="-O6 -mpentium -mstack-align-double
  413.      -fomit-frame-pointer -felide-constructors -fno-exceptions
  414.      -fno-rtti" ./configure --prefix=/usr/local/mysql
  415.      --enable-assembler --with-mysqld-ldflags=-all-static
  416.      --with-extra-charsets=complex'
  417. Linux 2.2.x with x686 with `gcc' 2.95.2
  418.      `CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc
  419.      CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer
  420.      -felide-constructors -fno-exceptions -fno-rtti" ./configure
  421.      --prefix=/usr/local/mysql --enable-assembler
  422.      --with-mysqld-ldflags=-all-static --disable-shared
  423.      --with-extra-charset=complex'
  424. SCO 3.2v5.0.4 i386 with `gcc' 2.7-95q4
  425.      `CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
  426.      --with-extra-charsets=complex'
  427. AIX 2 4 with `gcc' 2.7.2.2
  428.      `CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
  429.      --with-extra-charsets=complex'
  430. OSF1 V4.0 564 alpha with `gcc' 2.8.1
  431.      `CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure
  432.      --prefix=/usr/local/mysql --with-low-memory
  433.      --with-extra-charsets=complex'
  434. Irix 6.3 IP32 with `gcc' 2.8.0
  435.      `CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
  436.      --with-extra-charsets=complex'
  437. BSDI BSD/OS 3.1 i386 with `gcc' 2.7.2.1
  438.      `CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql
  439.      --with-extra-charsets=complex'
  440. BSDI BSD/OS 2.1 i386 with `gcc' 2.7.2
  441.      `CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
  442.      --with-extra-charsets=complex'
  443. Anyone who has more optimal options for any of the configurations listed
  444. above can always mail them to the developer's mailing list at
  445. <internals@lists.mysql.com>.
  446. RPM distributions prior to *MySQL* Version 3.22 are user-contributed.
  447. Beginning with Version 3.22, some RPMs are generated by us at MySQL AB.
  448. If you want to compile a debug version of *MySQL*, you should add
  449. `--with-debug' or `--with-debug=full' to the above configure lines and
  450. remove any `-fomit-frame-pointer' options.
  451. Post-installation Setup and Testing
  452. ===================================
  453. Once you've installed *MySQL* (from either a binary or source
  454. distribution), you need to initialize the grant tables, start the
  455. server, and make sure that the server works okay.  You may also wish to
  456. arrange for the server to be started and stopped automatically when
  457. your system starts up and shuts down.
  458. Normally you install the grant tables and start the server like this
  459. for installation from a source distribution:
  460.      shell> ./scripts/mysql_install_db
  461.      shell> cd mysql_installation_directory
  462.      shell> ./bin/safe_mysqld --user=mysql &
  463. For a binary distribution, do this:
  464.      shell> cd mysql_installation_directory
  465.      shell> ./bin/mysql_install_db
  466.      shell> ./bin/safe_mysqld --user=mysql &
  467. This creates the `mysql' database which will hold all database
  468. privileges, the `test' database which you can use to test *MySQL* and
  469. also privilege entries for the user that run `mysql_install_db' and a
  470. `root' user (without any passwords).  This also starts the `mysqld'
  471. server.
  472. `mysql_install_db' will not overwrite any old privilege tables, so it
  473. should be safe to run in any circumstances.  If you don't want to have
  474. the `test' database you can remove it with `mysqladmin -u root drop
  475. test'.
  476. Testing is most easily done from the top-level directory of the *MySQL*
  477. distribution.  For a binary distribution, this is your installation
  478. directory (typically something like `/usr/local/mysql').  For a source
  479. distribution, this is the main directory of your *MySQL* source tree.
  480. In the commands shown below in this section and in the following
  481. subsections, `BINDIR' is the path to the location in which programs
  482. like `mysqladmin' and `safe_mysqld' are installed.  For a binary
  483. distribution, this is the `bin' directory within the distribution.  For
  484. a source distribution, `BINDIR' is probably `/usr/local/bin', unless
  485. you specified an installation directory other than `/usr/local' when
  486. you ran `configure'.  `EXECDIR' is the location in which the `mysqld'
  487. server is installed.  For a binary distribution, this is the same as
  488. `BINDIR'.  For a source distribution, `EXECDIR' is probably
  489. `/usr/local/libexec'.
  490. Testing is described in detail below:
  491.   1. If necessary, start the `mysqld' server and set up the initial
  492.      *MySQL* grant tables containing the privileges that determine how
  493.      users are allowed to connect to the server.  This is normally done
  494.      with the `mysql_install_db' script:
  495.           shell> scripts/mysql_install_db
  496.      Typically, `mysql_install_db' needs to be run only the first time
  497.      you install *MySQL*.  Therefore, if you are upgrading an existing
  498.      installation, you can skip this step. (However, `mysql_install_db'
  499.      is quite safe to use and will not update any tables that already
  500.      exist, so if you are unsure of what to do, you can always run
  501.      `mysql_install_db'.)
  502.      `mysql_install_db' creates six tables (`user', `db', `host',
  503.      `tables_priv', `columns_priv', and `func') in the `mysql'
  504.      database.  A description of the initial privileges is given in
  505.      *Note Default privileges::.  Briefly, these privileges allow the
  506.      *MySQL* `root' user to do anything, and allow anybody to create or
  507.      use databases with a name of `'test'' or starting with `'test_''.
  508.      If you don't set up the grant tables, the following error will
  509.      appear in the log file when you start the server:
  510.           mysqld: Can't find file: 'host.frm'
  511.      The above may also happen with a binary *MySQL* distribution if you
  512.      don't start *MySQL* by executing exactly `./bin/safe_mysqld'!
  513.      *Note safe_mysqld::.
  514.      You might need to run `mysql_install_db' as `root'.  However, if
  515.      you prefer, you can run the *MySQL* server as an unprivileged
  516.      (non-`root') user, provided that user can read and write files in
  517.      the database directory.  Instructions for running *MySQL* as an
  518.      unprivileged user are given in *Note Changing *MySQL* user:
  519.      Changing MySQL user.
  520.      If you have problems with `mysql_install_db', see *Note
  521.      `mysql_install_db': mysql_install_db.
  522.      There are some alternatives to running the `mysql_install_db'
  523.      script as it is provided in the *MySQL* distribution:
  524.         * You may want to edit `mysql_install_db' before running it, to
  525.           change the initial privileges that are installed into the
  526.           grant tables.  This is useful if you want to install *MySQL*
  527.           on a lot of machines with the same privileges.  In this case
  528.           you probably should need only to add a few extra `INSERT'
  529.           statements to the `mysql.user' and `mysql.db' tables!
  530.         * If you want to change things in the grant tables after
  531.           installing them, you can run `mysql_install_db', then use
  532.           `mysql -u root mysql' to connect to the grant tables as the
  533.           *MySQL* `root' user and issue SQL statements to modify the
  534.           grant tables directly.
  535.         * It is possible to re-create the grant tables completely after
  536.           they have already been created.  You might want to do this if
  537.           you've already installed the tables but then want to
  538.           re-create them after editing `mysql_install_db'.
  539.      For more information about these alternatives, see *Note Default
  540.      privileges::.
  541.   2. Start the *MySQL* server like this:
  542.           shell> cd mysql_installation_directory
  543.           shell> bin/safe_mysqld &
  544.      If you have problems starting the server, see *Note Starting
  545.      server::.
  546.   3. Use `mysqladmin' to verify that the server is running.  The
  547.      following commands provide a simple test to check that the server
  548.      is up and responding to connections:
  549.           shell> BINDIR/mysqladmin version
  550.           shell> BINDIR/mysqladmin variables
  551.      The output from `mysqladmin version' varies slightly depending on
  552.      your platform and version of *MySQL*, but should be similar to
  553.      that shown below:
  554.           shell> BINDIR/mysqladmin version
  555.           mysqladmin  Ver 8.14 Distrib 3.23.32, for linux on i586
  556.           Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  557.           This software comes with ABSOLUTELY NO WARRANTY. This is free software,
  558.           and you are welcome to modify and redistribute it under the GPL license
  559.           
  560.           Server version          3.23.32-debug
  561.           Protocol version        10
  562.           Connection              Localhost via Unix socket
  563.           TCP port                3306
  564.           UNIX socket             /tmp/mysql.sock
  565.           Uptime:                 16 sec
  566.           
  567.           Threads: 1  Questions: 9  Slow queries: 0  Opens: 7  Flush tables: 2  Open tables: 0 Queries per second avg: 0.000  Memory in use: 132K  Max memory used: 16773K
  568.      To get a feeling for what else you can do with `BINDIR/mysqladmin',
  569.      invoke it with the `--help' option.
  570.   4. Verify that you can shut down the server:
  571.           shell> BINDIR/mysqladmin -u root shutdown
  572.   5. Verify that you can restart the server.  Do this using
  573.      `safe_mysqld' or by invoking `mysqld' directly.  For example:
  574.           shell> BINDIR/safe_mysqld --log &
  575.      If `safe_mysqld' fails, try running it from the *MySQL*
  576.      installation directory (if you are not already there).  If that
  577.      doesn't work, see *Note Starting server::.
  578.   6. Run some simple tests to verify that the server is working.  The
  579.      output should be similar to what is shown below:
  580.           shell> BINDIR/mysqlshow
  581.           +-----------+
  582.           | Databases |
  583.           +-----------+
  584.           | mysql     |
  585.           +-----------+
  586.           
  587.           shell> BINDIR/mysqlshow mysql
  588.           Database: mysql
  589.           +--------------+
  590.           |    Tables    |
  591.           +--------------+
  592.           | columns_priv |
  593.           | db           |
  594.           | func         |
  595.           | host         |
  596.           | tables_priv  |
  597.           | user         |
  598.           +--------------+
  599.           
  600.           shell> BINDIR/mysql -e "select host,db,user from db" mysql
  601.           +------+--------+------+
  602.           | host | db     | user |
  603.           +------+--------+------+
  604.           | %    | test   |      |
  605.           | %    | test_% |      |
  606.           +------+--------+------+
  607.      There is also a benchmark suite in the `sql-bench' directory
  608.      (under the *MySQL* installation directory) that you can use to
  609.      compare how *MySQL* performs on different platforms. The
  610.      `sql-bench/Results' directory contains the results from many runs
  611.      against different databases and platforms.  To run all tests,
  612.      execute these commands:
  613.           shell> cd sql-bench
  614.           shell> run-all-tests
  615.      If you don't have the `sql-bench' directory, you are probably
  616.      using an RPM for a binary distribution.  (Source distribution RPMs
  617.      include the benchmark directory.) In this case, you must first
  618.      install the benchmark suite before you can use it.  Beginning with
  619.      *MySQL* Version 3.22, there are benchmark RPM files named
  620.      `mysql-bench-VERSION-i386.rpm' that contain benchmark code and
  621.      data.
  622.      If you have a source distribution, you can also run the tests in
  623.      the `tests' subdirectory. For example, to run
  624.      `auto_increment.tst', do this:
  625.           shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
  626.      The expected results are shown in the `./tests/auto_increment.res'
  627.      file.
  628. Problems Running mysql_install_db
  629. ---------------------------------
  630. The purpose of the `mysql_install_db' script is to generate new *MySQL*
  631. privilege tables.  It will not affect any other data!  It will also not
  632. do anything if you already have MySQL privilege tables installed!
  633. If you want to re-create your privilege tables, you should take down
  634. the mysqld server, if it's running, and then do something like:
  635.      mv mysql-data-directory/mysql mysql-data-directory/mysql-old
  636.      mysql_install_db
  637. This section lists problems you might encounter when you run
  638. `mysql_install_db':
  639. *`mysql_install_db' doesn't install the grant tables*
  640.      You may find that `mysql_install_db' fails to install the grant
  641.      tables and terminates after displaying the following messages:
  642.           starting mysqld daemon with databases from XXXXXX
  643.           mysql daemon ended
  644.      In this case, you should examine the log file very carefully!  The
  645.      log should be located in the directory `XXXXXX' named by the error
  646.      message, and should indicate why `mysqld' didn't start.  If you
  647.      don't understand what happened, include the log when you post a
  648.      bug report using `mysqlbug'!  *Note Bug reports::.
  649. *There is already a `mysqld' daemon running*
  650.      In this case, you probably don't have to run `mysql_install_db' at
  651.      all.  You have to run `mysql_install_db' only once, when you
  652.      install *MySQL* the first time.
  653. *Installing a second `mysqld' daemon doesn't work when one daemon is running*
  654.      This can happen when you already have an existing *MySQL*
  655.      installation, but want to put a new installation in a different
  656.      place (for example, for testing, or perhaps you simply want to run
  657.      two installations at the same time).  Generally the problem that
  658.      occurs when you try to run the second server is that it tries to
  659.      use the same socket and port as the old one.  In this case you
  660.      will get the error message: `Can't start server: Bind on TCP/IP
  661.      port: Address already in use' or `Can't start server : Bind on
  662.      unix socket...'. *Note Installing many servers::.
  663. *You don't have write access to `/tmp'*
  664.      If you don't have write access to create a socket file at the
  665.      default place (in `/tmp') or permission to create temporary files
  666.      in `/tmp,' you will get an error when running `mysql_install_db'
  667.      or when starting or using `mysqld'.
  668.      You can specify a different socket and temporary directory as
  669.      follows:
  670.           shell> TMPDIR=/some_tmp_dir/
  671.           shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock
  672.           shell> export TMPDIR MYSQL_UNIX_PORT
  673.      `some_tmp_dir' should be the path to some directory for which you
  674.      have write permission. *Note Environment variables::.
  675.      After this you should be able to run `mysql_install_db' and start
  676.      the server with these commands:
  677.           shell> scripts/mysql_install_db
  678.           shell> BINDIR/safe_mysqld &
  679. *`mysqld' crashes immediately*
  680.      If you are running RedHat Version 5.0 with a version of `glibc'
  681.      older than 2.0.7-5, you should make sure you have installed all
  682.      `glibc' patches!  There is a lot of information about this in the
  683.      *MySQL* mail archives.  Links to the mail archives are available
  684.      at the online *MySQL* documentation page
  685.      (http://www.mysql.com/documentation/).  Also, see *Note Linux::.
  686.      You can also start `mysqld' manually using the
  687.      `--skip-grant-tables' option and add the privilege information
  688.      yourself using `mysql':
  689.           shell> BINDIR/safe_mysqld --skip-grant-tables &
  690.           shell> BINDIR/mysql -u root mysql
  691.      From `mysql', manually execute the SQL commands in
  692.      `mysql_install_db'.  Make sure you run `mysqladmin
  693.      flush-privileges' or `mysqladmin reload' afterward to tell the
  694.      server to reload the grant tables.
  695. Problems Starting the MySQL Server
  696. ----------------------------------
  697. Generally, you start the `mysqld' server in one of three ways:
  698.    * By invoking `mysql.server'.  This script is used primarily at
  699.      system startup and shutdown, and is described more fully in *Note
  700.      Automatic start::.
  701.    * By invoking `safe_mysqld', which tries to determine the proper
  702.      options for `mysqld' and then runs it with those options. *Note
  703.      safe_mysqld::.
  704.    * On NT you should install `mysqld' as a service as follows:
  705.           binmysqld-nt --install               # Install MySQL as a service
  706.      You can now start/stop `mysqld' as follows:
  707.           NET START mysql
  708.           NET STOP mysql
  709.      Note that in this case you can't use any other options for
  710.      `mysqld'!
  711.      You can remove the service as follows:
  712.           binmysqld-nt --remove                # remove MySQL as a service
  713.    * By invoking `mysqld' directly.
  714. When the `mysqld' daemon starts up, it changes directory to the data
  715. directory.  This is where it expects to write log files and the pid
  716. (process ID) file, and where it expects to find databases.
  717. The data directory location is hardwired in when the distribution is
  718. compiled.  However, if `mysqld' expects to find the data directory
  719. somewhere other than where it really is on your system, it will not work
  720. properly.  If you have problems with incorrect paths, you can find out
  721. what options `mysqld' allows and what the default path settings are by
  722. invoking `mysqld' with the `--help' option.  You can override the
  723. defaults by specifying the correct pathnames as command-line arguments
  724. to `mysqld'.  (These options can be used with `safe_mysqld' as well.)
  725. Normally you should need to tell `mysqld' only the base directory under
  726. which *MySQL* is installed.  You can do this with the `--basedir'
  727. option.  You can also use `--help' to check the effect of changing path
  728. options (note that `--help' _must_ be the final option of the `mysqld'
  729. command).  For example:
  730.      shell> EXECDIR/mysqld --basedir=/usr/local --help
  731. Once you determine the path settings you want, start the server without
  732. the `--help' option.
  733. Whichever method you use to start the server, if it fails to start up
  734. correctly, check the log file to see if you can find out why.  Log files
  735. are located in the data directory (typically `/usr/local/mysql/data'
  736. for a binary distribution, `/usr/local/var' for a source distribution,
  737. `mysqlmysql.err' on Windows.)  Look in the data directory for files
  738. with names of the form `host_name.err' and `host_name.log' where
  739. `host_name' is the name of your server host.  Then check the last few
  740. lines of these files:
  741.      shell> tail host_name.err
  742.      shell> tail host_name.log
  743. If you find something like the following in the log file:
  744.      000729 14:50:10  bdb:  Recovery function for LSN 1 27595 failed
  745.      000729 14:50:10  bdb:  warning: ./test/t1.db: No such file or directory
  746.      000729 14:50:10  Can't init databases
  747. this means that you didn't started mysqld with `--bdb-no-recover' and
  748. Berkeley DB found something wrong with it's log files when it tried to
  749. recover your databases.  To be able to continue, you should move away
  750. the old Berkeley DB log file from the database directory to some other
  751. place, where you can later examine these.  The log files are named
  752. `log.0000000001', where the number will increase over time.
  753. If you are running `mysqld' with BDB table support and mysqld core
  754. dumps at start this could be because of some problems with the BDB
  755. recover log.  In this case you can try starting `mysqld' with
  756. `--bdb-no-recover'.  If this helps, then you should remove all `log.*'
  757. files from the data directory and try starting `mysqld' again.
  758. If you get the following error, it means that some other program (or
  759. another `mysqld' server) is already using the TCP/IP port or socket
  760. `mysqld' is trying to use:
  761.      Can't start server: Bind on TCP/IP port: Address already in use
  762.        or
  763.      Can't start server : Bind on unix socket...
  764. Use `ps' to make sure that you don't have another `mysqld' server
  765. running.  If you can't find another server running, you can try to
  766. execute the command `telnet your-host-name tcp-ip-port-number' and press
  767. `RETURN' a couple of times.  If you don't get an error message like
  768. `telnet: Unable to connect to remote host: Connection refused',
  769. something is using the TCP/IP port `mysqld' is trying to use.  See
  770. *Note mysql_install_db:: and *Note Multiple servers::.
  771. If `mysqld' is currently running, you can find out what path settings
  772. it is using by executing this command:
  773.      shell> mysqladmin variables
  774.      
  775.      or
  776.      
  777.      shell> mysqladmin -h 'your-host-name' variables
  778. If `safe_mysqld' starts the server but you can't connect to it, you
  779. should make sure you have an entry in `/etc/hosts' that looks like this:
  780.      127.0.0.1       localhost
  781. This problem occurs only on systems that don't have a working thread
  782. library and for which *MySQL* must be configured to use MIT-pthreads.
  783. On Windows, you can try to start `mysqld' as follows:
  784.      C:mysqlbinmysqld --standalone --debug
  785. This will not run in the background and it should also write a trace in
  786. `mysqld.trace', which may help you determine the source of your
  787. problems. *Note Windows::.
  788. If you are using BDB (Berkeley DB) tables, you should familiarize
  789. yourself with the different BDB specific startup options. *Note BDB
  790. start::.
  791. If you are using Gemini tables, refer to the Gemini-specific startup
  792. options.  *Note GEMINI start::.
  793. If you are using Innobase tables, refer to the Innobase-specific startup
  794. options. *Note INNOBASE start::.
  795. Starting and Stopping MySQL Automatically
  796. -----------------------------------------
  797. The `mysql.server' script can be used to start or stop the server by
  798. invoking it with `start' or `stop' arguments:
  799.      shell> mysql.server start
  800.      shell> mysql.server stop
  801. `mysql.server' can be found in the `share/mysql' directory under the
  802. *MySQL* installation directory or in the `support-files' directory of
  803. the *MySQL* source tree.
  804. Before `mysql.server' starts the server, it changes directory to the
  805. *MySQL* installation directory, then invokes `safe_mysqld'.  You might
  806. need to edit `mysql.server' if you have a binary distribution that
  807. you've installed in a non-standard location.  Modify it to `cd' into
  808. the proper directory before it runs `safe_mysqld'. If you want the
  809. server to run as some specific user, you can change the
  810. `mysql_daemon_user=root' line to use another user.  You can also modify
  811. `mysql.server' to pass other options to `safe_mysqld'.
  812. `mysql.server stop' brings down the server by sending a signal to it.
  813. You can take down the server manually by executing `mysqladmin
  814. shutdown'.
  815. You might want to add these start and stop commands to the appropriate
  816. places in your `/etc/rc*' files when you start using *MySQL* for
  817. production applications.  Note that if you modify `mysql.server', then
  818. upgrade *MySQL* sometime, your modified version will be overwritten, so
  819. you should make a copy of your edited version that you can reinstall.
  820. If your system uses `/etc/rc.local' to start external scripts, you
  821. should append the following to it:
  822.      /bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
  823. You can also add options for `mysql.server' in a global `/etc/my.cnf'
  824. file.  A typical `/etc/my.cnf' file might look like this:
  825.      [mysqld]
  826.      datadir=/usr/local/mysql/var
  827.      socket=/tmp/mysqld.sock
  828.      port=3306
  829.      
  830.      [mysql.server]
  831.      user=mysql
  832.      basedir=/usr/local/mysql
  833. The `mysql.server' script uses the following variables: `user',
  834. `datadir', `basedir', `bindir', and `pid-file'.
  835. The following table shows which option sections each of the startup
  836. script uses:
  837. `mysqld'       `mysqld' and `server'
  838. `mysql.server' `mysql.server', `mysqld' and `server'
  839. `safe_mysqld'  `mysql.server', `mysqld' and `server'
  840. *Note Option files::.
  841. Command-line Options
  842. --------------------
  843. `mysqld' accepts the following command-line options:
  844. `--ansi'
  845.      Use ANSI SQL syntax instead of MySQL syntax. *Note ANSI mode::.
  846. `-b, --basedir=path'
  847.      Path to installation directory. All paths are usually resolved
  848.      relative to this.
  849. `--big-tables'
  850.      Allow big result sets by saving all temporary sets on file. It
  851.      solves most 'table full' errors, but also slows down the queries
  852.      where in-memory tables would suffice. Since Version 3.23.2,
  853.      *MySQL* is able to solve it automaticaly by using memory for small
  854.      temporary tables and switching to disk tables where necessary.
  855. `--bind-address=IP'
  856.      IP address to bind to.
  857. `--character-sets-dir=path'
  858.      Directory where character sets are. *Note Character sets::.
  859. `--chroot=path'
  860.      Chroot mysqld daemon during startup.  Recommended security
  861.      measure. It will somewhat limit `LOAD DATA INFILE' and `SELECT ...
  862.      INTO OUTFILE' though.
  863. `-h, --datadir=path'
  864.      Path to the database root.
  865. `--default-character-set=charset'
  866.      Set the default character set. *Note Character sets::.
  867. `--default-table-type=type'
  868.      Set the default table type for tables. *Note Table types::.
  869. `--delay-key-write-for-all-tables'
  870.      Don't flush key buffers between writes for any `MyISAM' table.
  871.      *Note Server parameters::.
  872. `--enable-locking'
  873.      Enable system locking.  Note that if you use this option on a
  874.      system which a not fully working lockd() (as on Linux) you will
  875.      easily get mysqld to deadlock.
  876. `-T, --exit-info'
  877.      This is a bit mask of different flags one can use for debugging the
  878.      mysqld server;  One should not use this option if one doesn't know
  879.      exactly what it does!
  880. `--flush'
  881.      Flush all changes to disk after each SQL command.  Normally *MySQL*
  882.      only does a write of all changes to disk after each SQL command
  883.      and lets the operating system handle the syncing to disk.  *Note
  884.      Crashing::.
  885. `-?, --help'
  886.      Display short help and exit.
  887. `--init-file=file'
  888.      Read SQL commands from this file at startup.
  889. `-L, --language=...'
  890.      Client error messages in given language. May be given as a full
  891.      path.  *Note Languages::.
  892. `-l, --log[=file]'
  893.      Log connections and queries to file. *Note Query log::.
  894. `--log-isam[=file]'
  895.      Log all ISAM/MyISAM changes to file (only used when debugging
  896.      ISAM/MyISAM).
  897. `--log-slow-queries[=file]'
  898.      Log all queries that have taken more than `long_query_time'
  899.      seconds to execute to file. *Note Slow query log::.
  900. `--log-update[=file]'
  901.      Log updates to `file.#' where `#' is a unique number if not given.
  902.      *Note Update log::.
  903. `--log-long-format'
  904.      Log some extra information to update log.  If you are using
  905.      `--log-slow-queries' then queries that are not using indexes are
  906.      logged to the slow query log.
  907. `--low-priority-updates'
  908.      Table-modifying operations (`INSERT'/`DELETE'/`UPDATE') will have
  909.      lower priority than selects.  It can also be done via `{INSERT |
  910.      REPLACE | UPDATE | DELETE} LOW_PRIORITY ...' to lower the priority
  911.      of only one query, or by `SET OPTION SQL_LOW_PRIORITY_UPDATES=1'
  912.      to change the priority in one thread.  *Note Table locking::.
  913. `--memlock'
  914.      Lock the `mysqld' process in memory.  This works only if your
  915.      system supports the `mlockall()' system call.  This may help if
  916.      you have a problem where the operating system is causing `mysqld'
  917.      to swap on disk.
  918. `--myisam-recover [=option[,option...]]] where option is one of DEFAULT, BACKUP, FORCE or QUICK.'
  919.      If this option is used, `mysqld' will on open check if the table is
  920.      marked as crashed or if if the table wasn't closed properly (The
  921.      last option only works if you are running with `--skip-locking').
  922.      If this is the case mysqld will run check on the table. If the
  923.      table was corrupted, `mysqld' will attempt to repair it.
  924.      The following options affects how the repair works.
  925.      DEFAULT              The same as not giving any option to
  926.                           `--myisam-recover'.
  927.      BACKUP               If the data table was changed during recover,
  928.                           save a backup of the `table_name.MYD' data
  929.                           file as `table_name-datetime.BAK'.
  930.      FORCE                Run recover even if we will loose more than
  931.                           one row from the .MYD file.
  932.      QUICK                Don't check the rows in the table if there
  933.                           isn't any delete blocks.
  934.      Before a table is automaticly repaired, mysqld will add a note
  935.      about this in the error log.  If you want to be able to recover
  936.      from most things without user intervention, you should use the
  937.      options `BACKUP,FORCE'.  This will force a repair of a table even
  938.      if some rows would be deleted, but it will keep the old data file
  939.      as a backup so that you can later examine what happened.
  940. `--pid-file=path'
  941.      Path to pid file used by `safe_mysqld'.
  942. `-P, --port=...'
  943.      Port number to listen for TCP/IP connections.
  944. `-o, --old-protocol'
  945.      Use the 3.20 protocol for compatibility with some very old clients.
  946.      *Note Upgrading-from-3.20::.
  947. `--one-thread'
  948.      Only use one thread (for debugging under Linux). *Note Debugging
  949.      server::.
  950. `-O, --set-variable var=option'
  951.      Give a variable a value. `--help' lists variables.  You can find a
  952.      full description for all variables in the `SHOW VARIABLES' section
  953.      in this manual. *Note SHOW VARIABLES::.  The tuning server
  954.      parameters section includes information of how to optimize these.
  955.      *Note Server parameters::.
  956. `--safe-mode'
  957.      Skip some optimize stages.  Implies `--skip-delay-key-write'.
  958. `--safe-show-database'
  959.      Don't show databases for which the user doesn't have any
  960.      privileges.
  961. `--secure'
  962.      IP numbers returned by the `gethostbyname()' system call are
  963.      checked to make sure they resolve back to the original hostname.
  964.      This makes it harder for someone on the outside to get access by
  965.      pretending to be another host. This option also adds some sanity
  966.      checks of hostnames. The option is turned off by default in
  967.      *MySQL* Version 3.21 because sometimes it takes a long time to
  968.      perform backward resolutions.  *MySQL* Version 3.22 caches
  969.      hostnames (unless `--skip-host-cache' is used) and has this option
  970.      enabled by default.
  971. `--skip-concurrent-insert'
  972.      Turn off the ability to select and insert at the same time on
  973.      `MyISAM' tables. (This is only to be used if you think you have
  974.      found a bug in this feature).
  975. `--skip-delay-key-write'
  976.      Ignore the `delay_key_write' option for all tables.  *Note Server
  977.      parameters::.
  978. `-Sg, --skip-grant-tables'
  979.      This option causes the server not to use the privilege system at
  980.      all. This gives everyone _full access_ to all databases!  (You can
  981.      tell a running server to start using the grant tables again by
  982.      executing `mysqladmin flush-privileges' or `mysqladmin reload'.)
  983. `--skip-locking'
  984.      Don't use system locking. To use `isamchk' or `myisamchk' you must
  985.      shut down the server. *Note Stability::.  Note that in *MySQL*
  986.      Version 3.23 you can use `REPAIR' and `CHECK' to repair/check
  987.      `MyISAM' tables.
  988. `--skip-name-resolve'
  989.      Hostnames are not resolved.  All `Host' column values in the grant
  990.      tables must be IP numbers or `localhost'. *Note DNS::.
  991. `--skip-networking'
  992.      Don't listen for TCP/IP connections at all.  All interaction with
  993.      `mysqld' must be made via Unix sockets.  This option is highly
  994.      recommended for systems where only local requests are allowed.
  995.      *Note DNS::.
  996. `--skip-new'
  997.      Don't use new, possible wrong routines.  Implies
  998.      `--skip-delay-key-write'.  This will also set default table type
  999.      to `ISAM'. *Note ISAM::.
  1000. `--skip-host-cache'
  1001.      Never use host name cache for faster name-ip resolution, but query
  1002.      DNS server on every connect instead. *Note DNS::.
  1003. `--skip-show-database'
  1004.      Don't allow 'SHOW DATABASE' commands, unless the user has
  1005.      *process* privilege.
  1006. `--skip-thread-priority'
  1007.      Disable using thread priorities for faster response time.
  1008. `--socket=path'
  1009.      Socket file to use for local connections instead of default
  1010.      `/tmp/mysql.sock'.
  1011. `-t, --tmpdir=path'
  1012.      Path for temporary files. It may be useful if your default `/tmp'
  1013.      directory resides on a partition too small to hold temporary
  1014.      tables.
  1015. `-u, --user=user_name'
  1016.      Run `mysqld' daemon as user `user_name'. This option is
  1017.      _mandatory_ when starting `mysqld' as root.
  1018. `-V, --version'
  1019.      Output version information and exit.
  1020. Option Files
  1021. ------------
  1022. *MySQL* Version 3.22 can read default startup options for the server
  1023. and for clients from option files.
  1024. *MySQL* reads default options from the following files on Unix:
  1025. *Filename*             *Purpose*
  1026. `/etc/my.cnf'          Global options
  1027. `DATADIR/my.cnf'       Server-specific options
  1028. `defaults-extra-file'  The file specified with -defaults-extra-file=#
  1029. `~/.my.cnf'            User-specific options
  1030. `DATADIR' is the *MySQL* data directory (typically
  1031. `/usr/local/mysql/data' for a binary installation or `/usr/local/var'
  1032. for a source installation).  Note that this is the directory that was
  1033. specified at configuration time, not the one specified with `--datadir'
  1034. when `mysqld' starts up!  (`--datadir' has no effect on where the
  1035. server looks for option files, because it looks for them before it
  1036. processes any command-line arguments.)
  1037. *MySQL* reads default options from the following files on Windows:
  1038. *Filename*             *Purpose*
  1039. `windows-system-directorymy.ini'Global options
  1040. `C:my.cnf'            Global options
  1041. `C:mysqldatamy.cnf' Server-specific options
  1042. Note that on Windows, you should specify all paths with `/' instead of
  1043. `'. If you use `', you need to specify this twice, as `' is the
  1044. escape character in *MySQL*.
  1045. *MySQL* tries to read option files in the order listed above.  If
  1046. multiple option files exist, an option specified in a file read later
  1047. takes precedence over the same option specified in a file read earlier.
  1048. Options specified on the command line take precedence over options
  1049. specified in any option file.  Some options can be specified using
  1050. environment variables.  Options specified on the command line or in
  1051. option files take precedence over environment variable values. *Note
  1052. Environment variables::.
  1053. The following programs support option files:  `mysql', `mysqladmin',
  1054. `mysqld', `mysqldump', `mysqlimport', `mysql.server', `myisamchk', and
  1055. `myisampack'.
  1056. You can use option files to specify any long option that a program
  1057. supports!  Run the program with `--help' to get a list of available
  1058. options.
  1059. An option file can contain lines of the following forms:
  1060. `#comment'
  1061.      Comment lines start with `#' or `;'. Empty lines are ignored.
  1062. `[group]'
  1063.      `group' is the name of the program or group for which you want to
  1064.      set options.  After a group line, any `option' or `set-variable'
  1065.      lines apply to the named group until the end of the option file or
  1066.      another group line is given.
  1067. `option'
  1068.      This is equivalent to `--option' on the command line.
  1069. `option=value'
  1070.      This is equivalent to `--option=value' on the command line.
  1071. `set-variable = variable=value'
  1072.      This is equivalent to `--set-variable variable=value' on the
  1073.      command line.  This syntax must be used to set a `mysqld' variable.
  1074. The `client' group allows you to specify options that apply to all
  1075. *MySQL* clients (not `mysqld'). This is the perfect group to use to
  1076. specify the password you use to connect to the server.  (But make sure
  1077. the option file is readable and writable only to yourself.)
  1078. Note that for options and values, all leading and trailing blanks are
  1079. automatically deleted.  You may use the escape sequences `b', `t',
  1080. `n', `r', `\', and `s' in your value string (`s' == blank).
  1081. Here is a typical global option file:
  1082.      [client]
  1083.      port=3306
  1084.      socket=/tmp/mysql.sock
  1085.      
  1086.      [mysqld]
  1087.      port=3306
  1088.      socket=/tmp/mysql.sock
  1089.      set-variable = key_buffer_size=16M
  1090.      set-variable = max_allowed_packet=1M
  1091.      
  1092.      [mysqldump]
  1093.      quick
  1094. Here is typical user option file:
  1095.      [client]
  1096.      # The following password will be sent to all standard MySQL clients
  1097.      password=my_password
  1098.      
  1099.      [mysql]
  1100.      no-auto-rehash
  1101.      set-variable = connect_timeout=2
  1102.      
  1103.      [mysql-hot-copy]
  1104.      interactive-timeout
  1105. If you have a source distribution, you will find sample configuration
  1106. files named `my-xxxx.cnf' in the `support-files' directory.  If you
  1107. have a binary distribution, look in the `DIR/share/mysql' directory,
  1108. where `DIR' is the pathname to the *MySQL* installation directory
  1109. (typically `/usr/local/mysql').  Currently there are sample
  1110. configuration files for small, medium, large, and very large systems.
  1111. You can copy `my-xxxx.cnf' to your home directory (rename the copy to
  1112. `.my.cnf') to experiment with this.
  1113. All *MySQL* clients that support option files support the following
  1114. options:
  1115. -no-defaults                  Don't read any option files.
  1116. -print-defaults               Print the program name and all options
  1117.                               that it will get.
  1118. -defaults-file=full-path-to-default-fileOnly use the given configuration file.
  1119. -defaults-extra-file=full-path-to-default-fileRead this configuration file after the
  1120.                               global configuration file but before the
  1121.                               user configuration file.
  1122. Note that the above options must be first on the command line to work!
  1123. `--print-defaults' may however be used directly after the
  1124. `--defaults-xxx-file' commands.
  1125. Note for developers:  Option file handling is implemented simply by
  1126. processing all matching options (that is, options in the appropriate
  1127. group) before any command-line arguments. This works nicely for
  1128. programs that use the last instance of an option that is specified
  1129. multiple times. If you have an old program that handles
  1130. multiply-specified options this way but doesn't read option files, you
  1131. need add only two lines to give it that capability.  Check the source
  1132. code of any of the standard *MySQL* clients to see how to do this.
  1133. In shell scripts you can use the `my_print_defaults' command to parse
  1134. the config files:
  1135.      shell> my_print_defaults client mysql
  1136.      --port=3306
  1137.      --socket=/tmp/mysql.sock
  1138.      --no-auto-rehash
  1139. The above output contains all options for the groups 'client' and
  1140. 'mysql'.
  1141. Installing many servers on the same machine
  1142. ===========================================
  1143. In some cases you may want to have many different `mysqld' deamons
  1144. (servers) running on the same machine.  You may for example want to run
  1145. a new version of *MySQL* for testing together with an old version that
  1146. is in production.  Another case is when you want to give different
  1147. users access to different mysqld servers that they manage themself.
  1148. One way to get a new server running is by starting it with a different
  1149. socket and port as follows:
  1150.      shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
  1151.      shell> MYSQL_TCP_PORT=3307
  1152.      shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
  1153.      shell> scripts/mysql_install_db
  1154.      shell> bin/safe_mysqld &
  1155. The environment variables appendix includes a list of other environment
  1156. variables you can use to affect `mysqld'. *Note Environment variables::.
  1157. The above is the quick and dirty way that one commonly use for testing.
  1158. The nice thing with this is that all connections you do in the above
  1159. shell will automaticly be directed to the new running server!
  1160. If you need to do this more permanently, you should create an own option
  1161. file for each server. *Note Option files::.  In your startup script that
  1162. is executed at boot time (mysql.server?) you should specify for both
  1163. servers:
  1164. `safe_mysqld --default-file=path-to-option-file'
  1165. At least the following options should be different per server:
  1166. `port=#'
  1167. `socket=path'
  1168. `pid-file=path'
  1169. The following options should be different, if they are used:
  1170. `log=path'
  1171. `log-bin=path'
  1172. `log-update=path'
  1173. `log-isam=path'
  1174. `bdb-logdir=path'
  1175. If you want more performance, you can also specify the following
  1176. differently:
  1177. `tmpdir=path'
  1178. `bdb-tmpdir=path'
  1179. *Note Command-line options::.
  1180. If you are installing binary *MySQL* versions (.tar files) and start
  1181. them with `./bin/safe_mysqld' then in most cases the only option you
  1182. need to add/change is the `socket' and `port' argument to `safe_mysqld'.
  1183. Upgrading/Downgrading MySQL
  1184. ===========================
  1185. You can always move the *MySQL* form and data files between different
  1186. versions on the same architecture as long as you have the same base
  1187. version of *MySQL*. The current base version is 3. If you change the
  1188. character set when running *MySQL* (which may also change the sort
  1189. order), you must run `myisamchk -r -q' on all tables.  Otherwise your
  1190. indexes may not be ordered correctly.
  1191. If you are afraid of new versions, you can always rename your old
  1192. `mysqld' to something like `mysqld'-'old-version-number'.  If your new
  1193. `mysqld' then does something unexpected, you can simply shut it down
  1194. and restart with your old `mysqld'!
  1195. When you do an upgrade you should also back up your old databases, of
  1196. course.
  1197. If after an upgrade, you experience problems with recompiled client
  1198. programs, like `Commands out of sync' or unexpected core dumps, you
  1199. probably have used an old header or library file when compiling your
  1200. programs.  In this case you should check the date for your `mysql.h'
  1201. file and `libmysqlclient.a' library to verify that they are from the new
  1202. *MySQL* distribution.  If not, please recompile your programs!
  1203. If you get some problems that the new `mysqld' server doesn't want to
  1204. start or that you can't connect without a password, check that you don't
  1205. have some old `my.cnf' file from your old installation!  You can check
  1206. this with: `program-name --print-defaults'.  If this outputs anything
  1207. other than the program name, you have an active `my.cnf' file that will
  1208. may affect things!
  1209. It is a good idea to rebuild and reinstall the `Msql-Mysql-modules'
  1210. distribution whenever you install a new release of *MySQL*,
  1211. particularly if you notice symptoms such as all your `DBI' scripts
  1212. dumping core after you upgrade *MySQL*.
  1213. Upgrading From Version 3.22 to Version 3.23
  1214. -------------------------------------------
  1215. *MySQL* Version 3.23 supports tables of the new `MyISAM' type and the
  1216. old `ISAM' type.  You don't have to convert your old tables to use
  1217. these with Version 3.23.  By default, all new tables will be created
  1218. with type `MyISAM' (unless you start `mysqld' with the
  1219. `--default-table-type=isam' option). You can change an `ISAM' table to
  1220. a `MyISAM' table with `ALTER TABLE' or the Perl script
  1221. `mysql_convert_table_format'.
  1222. Version 3.22 and 3.21 clients will work without any problems with a
  1223. Version 3.23 server.
  1224. The following lists tell what you have to watch out for when upgrading
  1225. to Version 3.23:
  1226.    * If you do a `DROP DATABASE' on a symbolic linked database, both the
  1227.      link and the original database is deleted.  (This didn't happen in
  1228.      3.22 because configure didn't detect the `readlink' system call).
  1229.    * `OPTIMIZE TABLE' now only works for *MyISAM* tables.  For other
  1230.      table types, you can use `ALTER TABLE' to optimize the table.
  1231.      During `OPTIMIZE TABLE' the table is now locked from other threads.
  1232.    * The *MySQL* client `mysql' is now by default started with the
  1233.      option `--no-named-commands (-g)'. This option can be disabled with
  1234.      `--enable-named-commands (-G)'. This may cause incompatibility
  1235.      problems in some cases, for example in SQL scripts that use named
  1236.      commands without a semicolon!  Long format commands still work
  1237.      from the first line.
  1238.    * If you are using the `german' character sort order, you must repair
  1239.      all your tables with `isamchk -r', as we have made some changes in
  1240.      the sort order!
  1241.    * The default return type of `IF' will now depend on both arguments
  1242.      and not only the first argument.
  1243.    * `AUTO_INCREMENT' will not work with negative numbers. The reason
  1244.      for this is that negative numbers caused problems when wrapping
  1245.      from -1 to 0.  `AUTO_INCREMENT' is now for MyISAM tables handled
  1246.      at a lower level and is much faster than before. For MyISAM tables
  1247.      old numbers are also not reused anymore, even if you delete some
  1248.      rows from the table.
  1249.    * `CASE', `DELAYED', `ELSE', `END', `FULLTEXT', `INNER', `RIGHT',
  1250.      `THEN' and `WHEN' are now reserved words.
  1251.    * `FLOAT(X)' is now a true floating-point type and not a value with
  1252.      a fixed number of decimals.
  1253.    * When declaring `DECIMAL(length,dec)' the length argument no longer
  1254.      includes a place for the sign or the decimal point.
  1255.    * A `TIME' string must now be of one of the following formats:
  1256.      `[[[DAYS] [H]H:]MM:]SS[.fraction]' or
  1257.      `[[[[[H]H]H]H]MM]SS[.fraction]'
  1258.    * `LIKE' now compares strings using the same character comparison
  1259.      rules as `'=''.  If you require the old behavior, you can compile
  1260.      *MySQL* with the `CXXFLAGS=-DLIKE_CMP_TOUPPER' flag.
  1261.    * `REGEXP' is now case insensitive for normal (not binary) strings.
  1262.    * When you check/repair tables you should use `CHECK TABLE' or
  1263.      `myisamchk' for `MyISAM' tables (`.MYI') and `isamchk' for ISAM
  1264.      (`.ISM') tables.
  1265.    * If you want your `mysqldump' files to be compatible between
  1266.      *MySQL* Version 3.22 and Version 3.23, you should not use the
  1267.      `--opt' or `--full' option to `mysqldump'.
  1268.    * Check all your calls to `DATE_FORMAT()' to make sure there is a
  1269.      `%' before each format character.  (Later *MySQL* Version 3.22 did
  1270.      allow this syntax.)
  1271.    * `mysql_fetch_fields_direct' is now a function (it was a macro) and
  1272.      it returns a pointer to a `MYSQL_FIELD' instead of a `MYSQL_FIELD'.
  1273.    * `mysql_num_fields()' can no longer be used on a `MYSQL*' object
  1274.      (it's now a function that takes `MYSQL_RES*' as an argument. You
  1275.      should now use `mysql_field_count()' instead.
  1276.    * In *MySQL* Version 3.22, the output of `SELECT DISTINCT ...' was
  1277.      almost always sorted.  In Version 3.23, you must use `GROUP BY' or
  1278.      `ORDER BY' to obtain sorted output.
  1279.    * `SUM()' now returns `NULL', instead of 0, if there is no matching
  1280.      rows. This is according to ANSI SQL.
  1281.    * An `AND' or `OR' with `NULL' values will now return `NULL' instead
  1282.      of 0. This mostly affects queries that use `NOT' on an `AND/OR'
  1283.      expression as `NOT NULL' = `NULL'.  `LPAD()' and `RPAD()' will
  1284.      shorten the result string if it's longer than the length argument.
  1285. Upgrading from Version 3.21 to Version 3.22
  1286. -------------------------------------------
  1287. Nothing that affects compatibility has changed between Version 3.21 and
  1288. 3.22.  The only pitfall is that new tables that are created with `DATE'
  1289. type columns will use the new way to store the date. You can't access
  1290. these new fields from an old version of `mysqld'.
  1291. After installing *MySQL* Version 3.22, you should start the new server
  1292. and then run the `mysql_fix_privilege_tables' script. This will add the
  1293. new privileges that you need to use the `GRANT' command.  If you forget
  1294. this, you will get `Access denied' when you try to use `ALTER TABLE',
  1295. `CREATE INDEX', or `DROP INDEX'. If your *MySQL* root user requires a
  1296. password, you should give this as an argument to
  1297. `mysql_fix_privilege_tables'.
  1298. The C API interface to `mysql_real_connect()' has changed.  If you have
  1299. an old client program that calls this function, you must place a `0' for
  1300. the new `db' argument (or recode the client to send the `db' element
  1301. for faster connections).  You must also call `mysql_init()' before
  1302. calling `mysql_real_connect()'!  This change was done to allow the new
  1303. `mysql_options()' function to save options in the `MYSQL' handler
  1304. structure.
  1305. The `mysqld' variable `key_buffer' has changed names to
  1306. `key_buffer_size', but you can still use the old name in your startup
  1307. files.
  1308. Upgrading from Version 3.20 to Version 3.21
  1309. -------------------------------------------
  1310. If you are running a version older than Version 3.20.28 and want to
  1311. switch to Version 3.21, you need to do the following:
  1312. You can start the `mysqld' Version 3.21 server with `safe_mysqld
  1313. --old-protocol' to use it with clients from a Version 3.20 distribution.
  1314. In this case, the new client function `mysql_errno()' will not return
  1315. any server error, only `CR_UNKNOWN_ERROR' (but it works for client
  1316. errors), and the server uses the old `password()' checking rather than
  1317. the new one.
  1318. If you are *NOT* using the `--old-protocol' option to `mysqld', you
  1319. will need to make the following changes:
  1320.    * All client code must be recompiled. If you are using ODBC, you
  1321.      must get the new *MyODBC* 2.x driver.
  1322.    * The script `scripts/add_long_password' must be run to convert the
  1323.      `Password' field in the `mysql.user' table to `CHAR(16)'.
  1324.    * All passwords must be reassigned in the `mysql.user' table (to get
  1325.      62-bit rather than 31-bit passwords).
  1326.    * The table format hasn't changed, so you don't have to convert any
  1327.      tables.
  1328. *MySQL* Version 3.20.28 and above can handle the new `user' table
  1329. format without affecting clients. If you have a *MySQL* version earlier
  1330. than Version 3.20.28, passwords will no longer work with it if you
  1331. convert the `user' table. So to be safe, you should first upgrade to at
  1332. least Version 3.20.28 and then upgrade to Version 3.21.
  1333. The new client code works with a 3.20.x `mysqld' server, so if you
  1334. experience problems with 3.21.x, you can use the old 3.20.x server
  1335. without having to recompile the clients again.
  1336. If you are not using the `--old-protocol' option to `mysqld', old
  1337. clients will issue the error message:
  1338.      ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
  1339. The new Perl `DBI'/`DBD' interface also supports the old `mysqlperl'
  1340. interface.  The only change you have to make if you use `mysqlperl' is
  1341. to change the arguments to the `connect()' function.  The new arguments
  1342. are: `host', `database', `user', `password' (the `user' and `password'
  1343. arguments have changed places).  *Note Perl `DBI' Class: Perl DBI Class.
  1344. The following changes may affect queries in old applications:
  1345.    * `HAVING' must now be specified before any `ORDER BY' clause.
  1346.    * The parameters to `LOCATE()' have been swapped.
  1347.    * There are some new reserved words. The most notable are `DATE',
  1348.      `TIME', and `TIMESTAMP'.
  1349. Upgrading to Another Architecture
  1350. ---------------------------------
  1351. If you are using *MySQL* Version 3.23, you can copy the `.frm', `.MYI',
  1352. and `.MYD' files between different architectures that support the same
  1353. floating-point format.  (*MySQL* takes care of any byte swapping
  1354. issues.)
  1355. The *MySQL* `ISAM' data and index files (`.ISD' and `*.ISM',
  1356. respectively) are architecture-dependent and in some cases
  1357. OS-dependent.  If you want to move your applications to another machine
  1358. that has a different architecture or OS than your current machine, you
  1359. should not try to move a database by simply copying the files to the
  1360. other machine. Use `mysqldump' instead.
  1361. By default, `mysqldump' will create a file full of SQL statements.  You
  1362. can then transfer the file to the other machine and feed it as input to
  1363. the `mysql' client.
  1364. Try `mysqldump --help' to see what options are available.  If you are
  1365. moving the data to a newer version of *MySQL*, you should use
  1366. `mysqldump --opt' with the newer version to get a fast, compact dump.
  1367. The easiest (although not the fastest) way to move a database between
  1368. two machines is to run the following commands on the machine on which
  1369. the database is located:
  1370.      shell> mysqladmin -h 'other hostname' create db_name
  1371.      shell> mysqldump --opt db_name 
  1372.              | mysql -h 'other hostname' db_name
  1373. If you want to copy a database from a remote machine over a slow
  1374. network, you can use:
  1375.      shell> mysqladmin create db_name
  1376.      shell> mysqldump -h 'other hostname' --opt --compress db_name 
  1377.              | mysql db_name
  1378. You can also store the result in a file, then transfer the file to the
  1379. target machine and load the file into the database there.  For example,
  1380. you can dump a database to a file on the source machine like this:
  1381.      shell> mysqldump --quick db_name | gzip > db_name.contents.gz
  1382. (The file created in this example is compressed.) Transfer the file
  1383. containing the database contents to the target machine and run these
  1384. commands there:
  1385.      shell> mysqladmin create db_name
  1386.      shell> gunzip < db_name.contents.gz | mysql db_name
  1387. You can also use `mysqldump' and `mysqlimport' to accomplish the
  1388. database transfer.  For big tables, this is much faster than simply
  1389. using `mysqldump'.  In the commands shown below, `DUMPDIR' represents
  1390. the full pathname of the directory you use to store the output from
  1391. `mysqldump'.
  1392. First, create the directory for the output files and dump the database:
  1393.      shell> mkdir DUMPDIR
  1394.      shell> mysqldump --tab=DUMPDIR db_name
  1395. Then transfer the files in the `DUMPDIR' directory to some corresponding
  1396. directory on the target machine and load the files into *MySQL* there:
  1397.      shell> mysqladmin create db_name           # create database
  1398.      shell> cat DUMPDIR/*.sql | mysql db_name   # create tables in database
  1399.      shell> mysqlimport db_name DUMPDIR/*.txt   # load data into tables
  1400. Also, don't forget to copy the `mysql' database, because that's where
  1401. the grant tables (`user', `db', `host') are stored.  You may have to
  1402. run commands as the *MySQL* `root' user on the new machine until you
  1403. have the `mysql' database in place.
  1404. After you import the `mysql' database on the new machine, execute
  1405. `mysqladmin flush-privileges' so that the server reloads the grant table
  1406. information.
  1407. How Standards-compatible Is MySQL?
  1408. **********************************
  1409. MySQL Extensions to ANSI SQL92
  1410. ==============================
  1411. *MySQL* includes some extensions that you probably will not find in
  1412. other SQL databases.  Be warned that if you use them, your code will
  1413. not be portable to other SQL servers.  In some cases, you can write
  1414. code that includes *MySQL* extensions, but is still portable, by using
  1415. comments of the form `/*! ... */'.  In this case, *MySQL* will parse and
  1416. execute the code within the comment as it would any other *MySQL*
  1417. statement, but other SQL servers will ignore the extensions.  For
  1418. example:
  1419.      SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
  1420. If you add a version number after the `'!'', the syntax will only be
  1421. executed if the *MySQL* version is equal to or newer than the used
  1422. version number:
  1423.      CREATE /*!32302 TEMPORARY */ TABLE (a int);
  1424. The above means that if you have Version 3.23.02 or newer, then *MySQL*
  1425. will use the `TEMPORARY' keyword.
  1426. *MySQL* extensions are listed below:
  1427.    * The field types `MEDIUMINT', `SET', `ENUM', and the different
  1428.      `BLOB' and `TEXT' types.
  1429.    * The field attributes `AUTO_INCREMENT', `BINARY', `NULL',
  1430.      `UNSIGNED', and `ZEROFILL'.
  1431.    * All string comparisons are case insensitive by default, with sort
  1432.      ordering determined by the current character set (ISO-8859-1
  1433.      Latin1 by default).  If you don't like this, you should declare
  1434.      your columns with the `BINARY' attribute or use the `BINARY' cast,
  1435.      which causes comparisons to be done according to the ASCII order
  1436.      used on the *MySQL* server host.
  1437.    * *MySQL* maps each database to a directory under the *MySQL* data
  1438.      directory, and tables within a database to filenames in the
  1439.      database directory.
  1440.      This has a few implications:
  1441.         - Database names and table names are case sensitive in *MySQL*
  1442.           on operating systems that have case-sensitive filenames (like
  1443.           most Unix systems). *Note Name case sensitivity::.
  1444.         - Database, table, index, column, or alias names may begin with
  1445.           a digit (but may not consist solely of digits).
  1446.         - You can use standard system commands to backup, rename, move,
  1447.           delete, and copy tables.  For example, to rename a table,
  1448.           rename the `.MYD', `.MYI', and `.frm' files to which the
  1449.           table corresponds.
  1450.    * In SQL statements, you can access tables from different databases
  1451.      with the `db_name.tbl_name' syntax.  Some SQL servers provide the
  1452.      same functionality but call this `User space'.  *MySQL* doesn't
  1453.      support tablespaces as in: `create table ralph.my_table...IN
  1454.      my_tablespace'.
  1455.    * `LIKE' is allowed on numeric columns.
  1456.    * Use of `INTO OUTFILE' and `STRAIGHT_JOIN' in a `SELECT' statement.
  1457.      *Note `SELECT': SELECT.
  1458.    * The `SQL_SMALL_RESULT' option in a `SELECT' statement.
  1459.    * `EXPLAIN SELECT' to get a description on how tables are joined.
  1460.    * Use of index names, indexes on a prefix of a field, and use of
  1461.      `INDEX' or `KEY' in a `CREATE TABLE' statement. *Note `CREATE
  1462.      TABLE': CREATE TABLE.
  1463.    * Use of `TEMPORARY' or `IF NOT EXISTS' with `CREATE TABLE'.
  1464.    * Use of `COUNT(DISTINCT list)' where 'list' is more than one
  1465.      element.
  1466.    * Use of `CHANGE col_name', `DROP col_name', or `DROP INDEX',
  1467.      `IGNORE' or `RENAME' in an `ALTER TABLE' statement. *Note `ALTER
  1468.      TABLE': ALTER TABLE.
  1469.    * Use of `RENAME TABLE'. *Note `RENAME TABLE': RENAME TABLE.
  1470.    * Use of multiple `ADD', `ALTER', `DROP', or `CHANGE' clauses in an
  1471.      `ALTER TABLE' statement.
  1472.    * Use of `DROP TABLE' with the keywords `IF EXISTS'.
  1473.    * You can drop multiple tables with a single `DROP TABLE' statement.
  1474.    * The `LIMIT' clause of the `DELETE' statement.
  1475.    * The `DELAYED' clause of the `INSERT' and `REPLACE' statements.
  1476.    * The `LOW_PRIORITY' clause of the `INSERT', `REPLACE', `DELETE',
  1477.      and `UPDATE' statements.
  1478.    * Use of `LOAD DATA INFILE'. In many cases, this syntax is
  1479.      compatible with Oracle's `LOAD DATA INFILE'. *Note `LOAD DATA':
  1480.      LOAD DATA.
  1481.    * The `ANALYZE TABLE', `CHECK TABLE', `OPTIMIZE TABLE', and `REPAIR
  1482.      TABLE' statements.
  1483.    * The `SHOW' statement.  *Note `SHOW': SHOW.
  1484.    * Strings may be enclosed by either `"' or `'', not just by `''.
  1485.    * Use of the escape `' character.
  1486.    * The `SET OPTION' statement. *Note `SET OPTION': SET OPTION.
  1487.    * You don't need to name all selected columns in the `GROUP BY' part.
  1488.      This gives better performance for some very specific, but quite
  1489.      normal queries.  *Note Group by functions::.
  1490.    * One can specify `ASC' and `DESC' with `GROUP BY'.
  1491.    * To make it easier for users who come from other SQL environments,
  1492.      *MySQL* supports aliases for many functions. For example, all
  1493.      string functions support both ANSI SQL syntax and ODBC syntax.
  1494.    * *MySQL* understands the `||' and `&&' operators to mean logical OR
  1495.      and AND, as in the C programming language.  In *MySQL*, `||' and
  1496.      `OR' are synonyms, as are `&&' and `AND'.  Because of this nice
  1497.      syntax, *MySQL* doesn't support the ANSI SQL `||' operator for
  1498.      string concatenation; use `CONCAT()' instead. Because `CONCAT()'
  1499.      takes any number of arguments, it's easy to convert use of the
  1500.      `||' operator to *MySQL*.
  1501.    * `CREATE DATABASE' or `DROP DATABASE'.  *Note `CREATE DATABASE':
  1502.      CREATE DATABASE.
  1503.    * The `%' operator is a synonym for `MOD()'.  That is, `N % M' is
  1504.      equivalent to `MOD(N,M)'.  `%' is supported for C programmers and
  1505.      for compatibility with PostgreSQL.
  1506.    * The `=', `<>', `<=' ,`<', `>=',`>', `<<', `>>', `<=>', `AND',
  1507.      `OR', or `LIKE' operators may be used in column comparisons to the
  1508.      left of the `FROM' in `SELECT' statements.  For example:
  1509.           mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
  1510.    * The `LAST_INSERT_ID()' function.  *Note `mysql_insert_id()':
  1511.      mysql_insert_id.
  1512.    * The `REGEXP' and `NOT REGEXP' extended regular expression
  1513.      operators.
  1514.    * `CONCAT()' or `CHAR()' with one argument or more than two
  1515.      arguments.  (In *MySQL*, these functions can take any number of
  1516.      arguments.)
  1517.    * The `BIT_COUNT()', `CASE', `ELT()', `FROM_DAYS()', `FORMAT()',
  1518.      `IF()', `PASSWORD()', `ENCRYPT()', `md5()', `ENCODE()', `DECODE()',
  1519.      `PERIOD_ADD()', `PERIOD_DIFF()', `TO_DAYS()', or `WEEKDAY()'
  1520.      functions.
  1521.    * Use of `TRIM()' to trim substrings. ANSI SQL only supports removal
  1522.      of single characters.
  1523.    * The `GROUP BY' functions `STD()', `BIT_OR()', and `BIT_AND()'.
  1524.    * Use of `REPLACE' instead of `DELETE' + `INSERT'.  *Note `REPLACE':
  1525.      REPLACE.
  1526.    * The `FLUSH flush_option' statement.
  1527.    * The possiblity to set variables in a statement with `:=':
  1528.           SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
  1529.           SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
  1530. Running MySQL in ANSI Mode
  1531. ==========================
  1532. If you start mysqld with the `--ansi' option, the following behavior of
  1533. *MySQL* changes:
  1534.    * `||' is string concatenation instead of `OR'.
  1535.    * You can have any number of spaces between a function name and the
  1536.      `('.  This forces all function names to be treated as reserved
  1537.      words.
  1538.    * `"' will be an identifier quote character (like the *MySQL* ``'
  1539.      quote character) and not a string quote character.
  1540.    * `REAL' will be a synonym for `FLOAT' instead of a synonym of
  1541.      `DOUBLE'.
  1542. MySQL Differences Compared to ANSI SQL92
  1543. ========================================
  1544. We try to make *MySQL* follow the ANSI SQL standard and the ODBC SQL
  1545. standard, but in some cases *MySQL* does some things differently:
  1546.    * `--' is only a comment if followed by a white space. *Note Missing
  1547.      comments::.
  1548.    * For `VARCHAR' columns, trailing spaces are removed when the value
  1549.      is stored. *Note Bugs::.
  1550.    * In some cases, `CHAR' columns are silently changed to `VARCHAR'
  1551.      columns. *Note Silent column changes::.
  1552.    * Privileges for a table are not automatically revoked when you
  1553.      delete a table. You must explicitly issue a `REVOKE' to revoke
  1554.      privileges for a table. *Note `GRANT': GRANT.
  1555.    * `NULL AND FALSE' will evaluate to `NULL' and not to `FALSE'.  This
  1556.      is because we don't think it's good to have to evaluate a lot of
  1557.      extra conditions in this case.
  1558. Functionality Missing from MySQL
  1559. ================================
  1560. The following functionality is missing in the current version of
  1561. *MySQL*.  For a prioritized list indicating when new extensions may be
  1562. added to *MySQL*, you should consult the online *MySQL* TODO list
  1563. (http://www.mysql.com/documentation/manual.php?section=TODO). That is
  1564. the latest version of the TODO list in this manual. *Note TODO::.
  1565. Sub-selects
  1566. -----------
  1567. The following will not yet work in *MySQL*:
  1568.      SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
  1569.      SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
  1570.      SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.id);
  1571. However, in many cases you can rewrite the query without a sub-select:
  1572.      SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
  1573.      SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
  1574. For more complicated subqueries you can often create temporary tables
  1575. to hold the subquery.  In some cases, however this option will not
  1576. work. The most frequently encountered of these cases arises with
  1577. `DELETE' statements, for which standard SQL does not support joins
  1578. (except in sub-selects).  For this situation there are two options
  1579. available until subqueries are supported by *MySQL*.
  1580. The first option is to use a procedural programming language (such as
  1581. Perl or PHP) to submit a `SELECT' query to obtain the primary keys for
  1582. the records to be deleted, and then use these values to construct the
  1583. `DELETE' statement (`DELETE FROM ... WHERE ... IN (key1, key2, ...)').
  1584. The second option is to use interactive SQL to contruct a set of
  1585. `DELETE' statements automatically, using the *MySQL* extension
  1586. `CONCAT()' (in lieu of the standard `||' operator).  For example:
  1587.      SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
  1588.        FROM tab1, tab2
  1589.       WHERE tab1.col1 = tab2.col2;
  1590. You can place this query in a script file and redirect input from it to
  1591. the `mysql' command-line interpreter, piping its output back to a
  1592. second instance of the interpreter:
  1593.      prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb
  1594. *MySQL* only supports `INSERT ... SELECT ...' and `REPLACE ... SELECT
  1595. ...' Independent sub-selects will probably be available in Version 4.0.
  1596. You can now use the function `IN()' in other contexts, however.
  1597. `SELECT INTO TABLE'
  1598. -------------------
  1599. *MySQL* doesn't yet support the Oracle SQL extension: `SELECT ... INTO
  1600. TABLE ...'.  *MySQL* supports instead the ANSI SQL syntax `INSERT INTO
  1601. ... SELECT ...', which is basically the same thing. *Note INSERT
  1602. SELECT::.
  1603.      INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
  1604.      tblTemp1.fldOrder_ID > 100;
  1605. Alternatively, you can use `SELECT INTO OUTFILE...' or `CREATE TABLE
  1606. ... SELECT' to solve your problem.
  1607. Transactions
  1608. ------------
  1609. As *MySQL* does nowadays support transactions, the following discussion
  1610. is only valid if you are only using the non-transaction-safe table
  1611. types. *Note COMMIT::.
  1612. The question is often asked, by the curious and the critical, "Why is
  1613. *MySQL* not a transactional database?" or "Why does *MySQL* not support
  1614. transactions?"
  1615. *MySQL* has made a conscious decision to support another paradigm for
  1616. data integrity, "atomic operations." It is our thinking and experience
  1617. that atomic operations offer equal or even better integrity with much
  1618. better performance. We, nonetheless, appreciate and understand the
  1619. transactional database paradigm and plan, within the next few releases,
  1620. to introduce transaction-safe tables on a per table basis. We will be
  1621. giving our users the possibility to decide if they need the speed of
  1622. atomic operations or if they need to use transactional features in their
  1623. applications.
  1624. How does one use the features of *MySQL* to maintain rigorous integrity
  1625. and how do these features compare with the transactional paradigm?
  1626. First, in the transactional paradigm, if your applications are written
  1627. in a way that is dependent on the calling of "rollback" instead of
  1628. "commit" in critical situations, then transactions are more convenient.
  1629. Moreover, transactions ensure that unfinished updates or corrupting
  1630. activities are not committed to the database; the server is given the
  1631. opportunity to do an automatic rollback and your database is saved.
  1632. *MySQL*, in almost all cases, allows you to solve for potential
  1633. problems by including simple checks before updates and by running simple
  1634. scripts that check the databases for inconsistencies and automatically
  1635. repair or warn if such occurs. Note that just by using the *MySQL* log
  1636. or even adding one extra log, one can normally fix tables perfectly
  1637. with no data integrity loss.
  1638. Moreover, fatal transactional updates can be rewritten to be atomic. In
  1639. fact,we will go so far as to say that all integrity problems that
  1640. transactions solve can be done with `LOCK TABLES' or atomic updates,
  1641. ensuring that you never will get an automatic abort from the database,
  1642. which is a common problem with transactional databases.
  1643. Not even transactions can prevent all loss if the server goes down.  In
  1644. such cases even a transactional system can lose data.  The difference
  1645. between different systems lies in just how small the time-lap is where
  1646. they could lose data. No system is 100% secure, only "secure enough."
  1647. Even Oracle, reputed to be the safest of transactional databases, is
  1648. reported to sometimes lose data in such situations.
  1649. To be safe with *MySQL*, you only need to have backups and have the
  1650. update logging turned on.  With this you can recover from any situation
  1651. that you could with any transactional database.  It is, of course,
  1652. always good to have backups, independent of which database you use.
  1653. The transactional paradigm has its benefits and its drawbacks. Many
  1654. users and application developers depend on the ease with which they can
  1655. code around problems where an abort appears to be, or is necessary, and
  1656. they may have to do a little more work with *MySQL* to either think
  1657. differently or write more. If you are new to the atomic operations
  1658. paradigm, or more familiar or more comfortable with transactions, do not
  1659. jump to the conclusion that *MySQL* has not addressed these issues.
  1660. Reliability and integrity are foremost in our minds.  Recent estimates
  1661. indicate that there are more than 1,000,000 mysqld servers currently
  1662. running, many of which are in production environments.  We hear very,
  1663. very seldom from our users that they have lost any data, and in almost
  1664. all of those cases user error is involved. This is, in our opinion, the
  1665. best proof of *MySQL*'s stability and reliability.
  1666. Lastly, in situations where integrity is of highest importance,
  1667. *MySQL*'s current features allow for transaction-level or better
  1668. reliability and integrity. If you lock tables with `LOCK TABLES', all
  1669. updates will stall until any integrity checks are made.  If you only
  1670. obtain a read lock (as opposed to a write lock), then reads and inserts
  1671. are still allowed to happen.  The new inserted records will not be seen
  1672. by any of the clients that have a `READ' lock until they release their
  1673. read locks.  With `INSERT DELAYED' you can queue inserts into a local
  1674. queue, until the locks are released, without having the client wait for
  1675. the insert to complete. *Note INSERT DELAYED::.
  1676. "Atomic," in the sense that we mean it, is nothing magical. It only
  1677. means that you can be sure that while each specific update is running,
  1678. no other user can interfere with it, and there will never be an
  1679. automatic rollback (which can happen on transaction based systems if
  1680. you are not very careful).  *MySQL* also guarantees that there will not
  1681. be any dirty reads.  You can find some example of how to write atomic
  1682. updates in the commit-rollback section. *Note Commit-rollback::.
  1683. We have thought quite a bit about integrity and performance, and we
  1684. believe that our atomic operations paradigm allows for both high
  1685. reliability and extremely high performance, on the order of three to
  1686. five times the speed of the fastest and most optimally tuned of
  1687. transactional databases. We didn't leave out transactions because they
  1688. are hard to do. The main reason we went with atomic operations as
  1689. opposed to transactions is that by doing this we could apply many speed
  1690. optimizations that would not otherwise have been possible.
  1691. Many of our users who have speed foremost in their minds are not at all
  1692. concerned about transactions. For them transactions are not an issue.
  1693. For those of our users who are concerned with or have wondered about
  1694. transactions vis-a-vis *MySQL*, there is a "*MySQL* way" as we have
  1695. outlined above.  For those where safety is more important than speed,
  1696. we recommend them to use the `BDB', `GEMINI' or `INNOBASE' tables for
  1697. all their critical data. *Note Table types::.
  1698. One final note: We are currently working on a safe replication schema
  1699. that we believe to be better than any commercial replication system we
  1700. know of. This system will work most reliably under the atomic
  1701. operations, non-transactional, paradigm. Stay tuned.
  1702. Stored Procedures and Triggers
  1703. ------------------------------
  1704. A stored procedure is a set of SQL commands that can be compiled and
  1705. stored in the server. Once this has been done, clients don't need to
  1706. keep reissuing the entire query but can refer to the stored procedure.
  1707. This provides better performance because the query has to be parsed
  1708. only once, and less information needs to be sent between the server and
  1709. the client. You can also raise the conceptual level by having libraries
  1710. of functions in the server.
  1711. A trigger is a stored procedure that is invoked when a particular event
  1712. occurs.  For example, you can install a stored procedure that is
  1713. triggered each time a record is deleted from a transaction table and
  1714. that automatically deletes the corresponding customer from a customer
  1715. table when all his transactions are deleted.
  1716. The planned update language will be able to handle stored procedures,
  1717. but without triggers. Triggers usually slow down everything, even
  1718. queries for which they are not needed.
  1719. To see when *MySQL* might get stored procedures, see *Note TODO::.
  1720. Foreign Keys
  1721. ------------
  1722. Note that foreign keys in SQL are not used to join tables, but are used
  1723. mostly for checking referential integrity (foreign key constraints).  If
  1724. you want to get results from multiple tables from a `SELECT' statement,
  1725. you do this by joining tables:
  1726.      SELECT * from table1,table2 where table1.id = table2.id;
  1727. *Note `JOIN': JOIN. *Note example-Foreign keys::.
  1728. The `FOREIGN KEY' syntax in *MySQL* exists only for compatibility with
  1729. other SQL vendors' `CREATE TABLE' commands; it doesn't do anything.
  1730. The `FOREIGN KEY' syntax without `ON DELETE ...' is mostly used for
  1731. documentation purposes. Some ODBC applications may use this to produce
  1732. automatic `WHERE' clauses, but this is usually easy to override.
  1733. `FOREIGN KEY' is sometimes used as a constraint check, but this check
  1734. is unnecessary in practice if rows are inserted into the tables in the
  1735. right order. *MySQL* only supports these clauses because some
  1736. applications require them to exist (regardless of whether or not they
  1737. work).
  1738. In *MySQL*, you can work around the problem of `ON DELETE ...' not
  1739. being implemented by adding the appropriate `DELETE' statement to an
  1740. application when you delete records from a table that has a foreign key.
  1741. In practice this is as quick (in some cases quicker) and much more
  1742. portable than using foreign keys.
  1743. In the near future we will extend the `FOREIGN KEY' implementation so
  1744. that at least the information will be saved in the table specification
  1745. file and may be retrieved by `mysqldump' and ODBC. At a later stage we
  1746. will implement the foreign key constraints for application that can't
  1747. easily be coded to avoid them.
  1748. Reasons NOT to Use Foreign Keys constraints
  1749. ...........................................
  1750. There are so many problems with foreign key constraints that we don't
  1751. know where to start:
  1752.    * Foreign key constraints make life very complicated, because the
  1753.      foreign key definitions must be stored in a database and
  1754.      implementing them would destroy the whole "nice approach" of using
  1755.      files that can be moved, copied, and removed.
  1756.    * The speed impact is terrible for `INSERT' and `UPDATE' statements,
  1757.      and in this case almost all `FOREIGN KEY' constraint checks are
  1758.      useless because you usually insert records in the right tables in
  1759.      the right order, anyway.
  1760.    * There is also a need to hold locks on many more tables when
  1761.      updating one table, because the side effects can cascade through
  1762.      the entire database. It's MUCH faster to delete records from one
  1763.      table first and subsequently delete them from the other tables.
  1764.    * You can no longer restore a table by doing a full delete from the
  1765.      table and then restoring all records (from a new source or from a
  1766.      backup).
  1767.    * If you use foreign key constraints you can't dump and restore
  1768.      tables unless you do so in a very specific order.
  1769.    * It's very easy to do "allowed" circular definitions that make the
  1770.      tables impossible to re-create each table with a single create
  1771.      statement, even if the definition works and is usable.
  1772.    * It's very easy to overlook `FOREIGN KEY ... ON DELETE' rules when
  1773.      one codes an application. It's not unusual that one loses a lot of
  1774.      important information just because a wrong or misused `ON DELETE'
  1775.      rule.
  1776. The only nice aspect of `FOREIGN KEY' is that it gives ODBC and some
  1777. other client programs the ability to see how a table is connected and
  1778. to use this to show connection diagrams and to help in building
  1779. applicatons.
  1780. *MySQL* will soon store `FOREIGN KEY' definitions so that a client can
  1781. ask for and receive an answer about how the original connection was
  1782. made. The current `.frm' file format does not have any place for it.
  1783. At a later stage we will implement the foreign key constraints for
  1784. application that can't easily be coded to avoid them.
  1785. Views
  1786. -----
  1787. *MySQL* doesn't yet support views, but we plan to implement these to
  1788. about 4.1.
  1789. Views are mostly useful in letting user access a set of relations as one
  1790. table (in read-only mode).  Many SQL databases doesn't allow one to
  1791. update any rows in a view, but you have to do the updates in the
  1792. separate tables.
  1793. As *MySQL* is mostly used in applications and on web system where the
  1794. application write has full control on the database usage, most of our
  1795. users haven't regarded views to be very important. (At least no one has
  1796. been interested enough of this to be prepared to finance the
  1797. implementation of views).
  1798. One doesn't need views in *MySQL* to restrict access to columns as
  1799. *MySQL* has a very sophisticated privilege system. *Note Privilege
  1800. system::.
  1801. `--' as the Start of a Comment
  1802. ------------------------------
  1803. Some other SQL databases use `--' to start comments. *MySQL* has `#' as
  1804. the start comment character, even if the `mysql' command-line tool
  1805. removes all lines that start with `--'.  You can also use the C comment
  1806. style `/* this is a comment */' with *MySQL*.  *Note Comments::.
  1807. *MySQL* Version 3.23.3 and above supports the `--' comment style only
  1808. if the comment is followed by a space.  This is because this degenerate
  1809. comment style has caused many problems with automatically generated SQL
  1810. queries that have used something like the following code, where we
  1811. automatically insert the value of the payment for `!payment!':
  1812.      UPDATE tbl_name SET credit=credit-!payment!
  1813. What do you think will happen when the value of `payment' is negative?
  1814. Because `1--1' is legal in SQL, we think it is terrible that `--' means
  1815. start comment.
  1816. In *MySQL* Version 3.23 you can, however, use: `1-- This is a comment'
  1817. The following discussion only concerns you if you are running a *MySQL*
  1818. version earlier than Version 3.23:
  1819. If you have a SQL program in a text file that contains `--' comments
  1820. you should use:
  1821.      shell> replace " --" " #" < text-file-with-funny-comments.sql 
  1822.               | mysql database
  1823. instead of the usual:
  1824.      shell> mysql database < text-file-with-funny-comments.sql
  1825. You can also edit the command file "in place" to change the `--'
  1826. comments to `#' comments:
  1827.      shell> replace " --" " #" -- text-file-with-funny-comments.sql
  1828. Change them back with this command:
  1829.      shell> replace " #" " --" -- text-file-with-funny-comments.sql
  1830. What Standards Does MySQL Follow?
  1831. =================================
  1832. Entry level SQL92. ODBC levels 0-2.
  1833. How to Cope Without `COMMIT'/`ROLLBACK'
  1834. =======================================
  1835. The following mostly applies only for `ISAM', `MyISAM', and `HEAP'
  1836. tables. If you only use transaction-safe tables (`BDB', `GEMINI' or
  1837. `INNOBASE' tables) in an a update, you can do `COMMIT' and `ROLLBACK'
  1838. also with *MySQL*.  *Note COMMIT::.
  1839. The problem with handling `COMMIT'-`ROLLBACK' efficiently with the
  1840. above table types would require a completely different table layout
  1841. than *MySQL* uses today.  The table type would also need extra threads
  1842. that do automatic cleanups on the tables, and the disk usage would be
  1843. much higher. This would make these table types about 2-4 times slower
  1844. than they are today.
  1845. For the moment, we prefer implementing the SQL server language
  1846. (something like stored procedures). With this you would very seldom
  1847. really need `COMMIT'-`ROLLBACK.' This would also give much better
  1848. performance.
  1849. Loops that need transactions normally can be coded with the help of
  1850. `LOCK TABLES', and you don't need cursors when you can update records
  1851. on the fly.
  1852. We at TcX had a greater need for a real fast database than a 100%
  1853. general database. Whenever we find a way to implement these features
  1854. without any speed loss, we will probably do it. For the moment, there
  1855. are many more important things to do. Check the TODO for how we
  1856. prioritize things at the moment. (Customers with higher levels of
  1857. support can alter this, so things may be reprioritized.)
  1858. The current problem is actually `ROLLBACK'. Without `ROLLBACK', you can
  1859. do any kind of `COMMIT' action with `LOCK TABLES'. To support
  1860. `ROLLBACK' with the above table types, *MySQL* would have to be changed
  1861. to store all old records that were updated and revert everything back
  1862. to the starting point if `ROLLBACK' was issued. For simple cases, this
  1863. isn't that hard to do (the current `isamlog' could be used for this
  1864. purpose), but it would be much more difficult to implement `ROLLBACK'
  1865. for `ALTER/DROP/CREATE TABLE'.
  1866. To avoid using `ROLLBACK', you can use the following strategy:
  1867.   1. Use `LOCK TABLES ...' to lock all the tables you want to access.
  1868.   2. Test conditions.
  1869.   3. Update if everything is okay.
  1870.   4. Use `UNLOCK TABLES' to release your locks.
  1871. This is usually a much faster method than using transactions with
  1872. possible `ROLLBACK's, although not always. The only situation this
  1873. solution doesn't handle is when someone kills the threads in the middle
  1874. of an update. In this case, all locks will be released but some of the
  1875. updates may not have been executed.
  1876. You can also use functions to update records in a single operation.
  1877. You can get a very efficient application by using the following
  1878. techniques:
  1879.    * Modify fields relative to their current value.
  1880.    * Update only those fields that actually have changed.
  1881. For example, when we are doing updates to some customer information, we
  1882. update only the customer data that has changed and test only that none
  1883. of the changed data, or data that depend on the changed data, has
  1884. changed compared to the original row. The test for changed data is done
  1885. with the `WHERE' clause in the `UPDATE' statement. If the record wasn't
  1886. updated, we give the client a message: "Some of the data you have
  1887. changed have been changed by another user". Then we show the old row
  1888. versus the new row in a window, so the user can decide which version of
  1889. the customer record he should use.
  1890. This gives us something that is similar to column locking but is
  1891. actually even better, because we only update some of the columns, using
  1892. values that are relative to their current values.  This means that
  1893. typical `UPDATE' statements look something like these:
  1894.      UPDATE tablename SET pay_back=pay_back+'relative change';
  1895.      
  1896.      UPDATE customer
  1897.        SET
  1898.          customer_date='current_date',
  1899.          address='new address',
  1900.          phone='new phone',
  1901.          money_he_owes_us=money_he_owes_us+'new_money'
  1902.        WHERE
  1903.          customer_id=id AND address='old address' AND phone='old phone';
  1904. As you can see, this is very efficient and works even if another client
  1905. has changed the values in the `pay_back' or `money_he_owes_us' columns.
  1906. In many cases, users have wanted `ROLLBACK' and/or `LOCK TABLES' for
  1907. the purpose of managing unique identifiers for some tables. This can be
  1908. handled much more efficiently by using an `AUTO_INCREMENT' column and
  1909. either the SQL function `LAST_INSERT_ID()' or the C API function
  1910. `mysql_insert_id()'. *Note `mysql_insert_id()': mysql_insert_id.
  1911. At MySQL AB, we have never had any need for row-level locking because
  1912. we have always been able to code around it. Some cases really need row
  1913. locking, but they are very few. If you want row-level locking, you can
  1914. use a flag column in the table and do something like this:
  1915.      UPDATE tbl_name SET row_flag=1 WHERE id=ID;
  1916. *MySQL* returns 1 for the number of affected rows if the row was found
  1917. and `row_flag' wasn't already 1 in the original row.
  1918. You can think of it as *MySQL* changed the above query to:
  1919.      UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1;
  1920. The MySQL Access Privilege System
  1921. *********************************
  1922. *MySQL* has an advanced but non-standard security/privilege system.
  1923. This section describes how it works.
  1924. General Security
  1925. ================
  1926. Anyone using *MySQL* on a computer connected to the Internet should
  1927. read this section to avoid the most common security mistakes.
  1928. In discussing security, we emphasize the necessity of fully protecting
  1929. the entire server host (not simply the *MySQL* server) against all types
  1930. of applicable attacks: eavesdropping, altering, playback, and denial of
  1931. service. We do not cover all aspects of availability and fault tolerance
  1932. here.
  1933. *MySQL* uses Access Control Lists (ACLs) security for all connections,
  1934. queries, and other operations that a user may attempt to perform. There
  1935. is also some support for SSL-encrypted connections between *MySQL*
  1936. clients and servers. Many of the concepts discussed here are not
  1937. specific to *MySQL* at all; the same general ideas apply to almost all
  1938. applications.
  1939. When running *MySQL*, follow these guidelines whenever possible:
  1940.    * DON'T EVER GIVE ANYONE (EXCEPT THE *MySQL* ROOT USER) ACCESS TO THE
  1941.      mysql.user TABLE!  The encrypted password is the real password in
  1942.      *MySQL*. If you know this for one user you can easily login as him
  1943.      if you have access to his 'host'.
  1944.    * Learn the *MySQL* access privilege system. The `GRANT' and
  1945.      `REVOKE' commands are used for restricting access to *MySQL*. Do
  1946.      not grant any more privileges than necessary. Never grant
  1947.      privileges to all hosts.
  1948.      Checklist:
  1949.         - Try `mysql -u root'. If you are able to connect successfully
  1950.           to the server without being asked for a password, you have
  1951.           problems. Any user (not just root) can connect to your
  1952.           *MySQL* server with full privileges!  Review the *MySQL*
  1953.           installation instructions, paying particular attention to the
  1954.           item about setting a `root' password.
  1955.         - Use the command `SHOW GRANTS' and check to see who has access
  1956.           to what. Remove those privileges that are not necessary using
  1957.           the `REVOKE' command.
  1958.    * Do not keep any plain-text passwords in your database. When your
  1959.      computer becomes compromised, the intruder can take the full list
  1960.      of passwords and use them. Instead use `MD5()' or another one-way
  1961.      hashing function.
  1962.    * Do not use passwords from dictionaries. There are special programs
  1963.      to break them. Even passwords like "xfish98" are very bad.  Much
  1964.      better is "duag98" which contains the same word "fish" but typed
  1965.      one key to the left on a standard QWERTY keyboard. Another method
  1966.      is to use "Mhall" which is taken from the first characters of of
  1967.      each word in the sentence "Mary had a little lamb." This is easy
  1968.      to remember and type, but hard to guess for someone who does not
  1969.      know it.
  1970.    * Invest in a firewall. This protects from at least 50% of all types
  1971.      of exploits in any software. Put *MySQL* behind the firewall or in
  1972.      a demilitarized zone (DMZ).
  1973.      Checklist:
  1974.         - Try to scan your ports from the Internet using a tool such as
  1975.           `nmap'. *MySQL* uses port 3306 by default. This port should
  1976.           be inaccessible from untrusted hosts. Another simple way to
  1977.           check whether or not your *MySQL* port is open is to type
  1978.           `telnet server_host 3306' from some remote machine, where
  1979.           `server_host' is the hostname of your *MySQL* server. If you
  1980.           get a connection and some garbage characters, the port is
  1981.           open, and should be closed on your firewall or router, unless
  1982.           you really have a good reason to keep it open. If `telnet'
  1983.           just hangs, everything is OK, the port is blocked.
  1984.    * Do not trust any data entered by your users. They can try to trick
  1985.      your code by entering special or escaped character sequences in
  1986.      Web forms, URLs, or whatever application you have built. Be sure
  1987.      that your application remains secure if a user enters something
  1988.      like "`; DROP DATABASE mysql;'". This is an extreme example, but
  1989.      large security leaks and data loss may occur as a result of
  1990.      hackers using similar techniques, if you do not prepare for them.
  1991.      Also remember to check numeric data. A common mistake is to
  1992.      protect only strings. Sometimes people think that if a database
  1993.      contains only publicly available data that it need not be
  1994.      protected. This is incorrect. At least denial-of-service type
  1995.      attacks can be performed on such databases. The simplest way to
  1996.      protect from this type of attack is to use apostrophes around the
  1997.      numeric constants: `SELECT * FROM table WHERE ID='234'' instead of
  1998.      `SELECT * FROM table WHERE ID=234'.  *MySQL* automatically
  1999.      converts this string to a number and strips all non-numeric
  2000.      symbols from it.
  2001.      Checklist:
  2002.         - All WWW applications:
  2003.              * Try to enter `'' and `"' in all your Web forms. If you
  2004.                get any kind of *MySQL* error, investigate the problem
  2005.                right away.
  2006.              * Try to modify any dynamic URLs by adding `%22' (`"'),
  2007.                `%23' (`#'), and `%27' (`'') in the URL.
  2008.              * Try to modify datatypes in dynamic URLs from numeric
  2009.                ones to character ones containing characters from
  2010.                previous examples. Your application should be safe
  2011.                against this and similar attacks.
  2012.              * Try to enter characters, spaces, and special symbols
  2013.                instead of numbers in numeric fields. Your application
  2014.                should remove them before passing them to *MySQL* or
  2015.                your application should generate an error. Passing
  2016.                unchecked values to *MySQL* is very dangerous!
  2017.              * Check data sizes before passing them to *MySQL*.
  2018.              * Consider having your application connect to the database
  2019.                using a different user name than the one you use for
  2020.                administrative purposes. Do not give your applications
  2021.                any more access privileges than they need.
  2022.         - Users of PHP:
  2023.              * Check out the `addslashes()' function.
  2024.         - Users of *MySQL* C API:
  2025.              * Check out the `mysql_escape()' API call.
  2026.         - Users of *MySQL*++:
  2027.              * Check out the `escape' and `quote' modifiers for query
  2028.                streams.
  2029.         - Users of Perl DBI:
  2030.              * Check out the `quote()' method.
  2031.    * Do not transmit plain (unencrypted) data over the Internet. These
  2032.      data are accessible to everyone who has the time and ability to
  2033.      intercept it and use it for their own purposes. Instead, use an
  2034.      encrypted protocol such as SSL or SSH. *MySQL* supports internal
  2035.      SSL connections as of Version 3.23.9.  SSH port-forwarding can be
  2036.      used to create an encrypted (and compressed) tunnel for the
  2037.      communication.
  2038.    * Learn to use the `tcpdump' and `strings' utilities. For most cases,
  2039.      you can check whether or not *MySQL* data streams are unencrypted
  2040.      by issuing a command like the following:
  2041.           shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
  2042.      (This works under Linux and should work with small modifications
  2043.      under other systems).  Warning: If you do not see data this
  2044.      doesn't always actually mean that it is encrypted. If you need
  2045.      high security, you should consult with a security expert.
  2046. How to Make MySQL Secure Against Crackers
  2047. =========================================
  2048. When you connect to a *MySQL* server, you normally should use a
  2049. password.  The password is not transmitted in clear text over the
  2050. connection, however the encryption algorithm is not very strong, and
  2051. with some effort a clever attacker can crack the password if he is able
  2052. to sniff the traffic between the client and the server. If the
  2053. connection between the client and the server goes through an untrusted
  2054. network, you should use an *SSH* tunnel to encrypt the communication.
  2055. All other information is transferred as text that can be read by anyone
  2056. who is able to watch the connection.  If you are concerned about this,
  2057. you can use the compressed protocol (in *MySQL* Version 3.22 and above)
  2058. to make things much harder.  To make things even more secure you should
  2059. use `ssh' (see `http://www.cs.hut.fi/ssh').  With this, you can get an
  2060. encrypted TCP/IP connection between a *MySQL* server and a *MySQL*
  2061. client.
  2062. To make a *MySQL* system secure, you should strongly consider the
  2063. following suggestions:
  2064.    * Use passwords for all *MySQL* users. Remember that anyone can log
  2065.      in as any other person as simply as `mysql -u other_user db_name'
  2066.      if `other_user' has no password.  It is common behavior with
  2067.      client/server applications that the client may specify any user
  2068.      name.  You can change the password of all users by editing the
  2069.      `mysql_install_db' script before you run it, or only the password
  2070.      for the *MySQL* `root' user like this:
  2071.           shell> mysql -u root mysql
  2072.           mysql> UPDATE user SET Password=PASSWORD('new_password')
  2073.                      WHERE user='root';
  2074.           mysql> FLUSH PRIVILEGES;
  2075.    * Don't run the *MySQL* daemon as the Unix `root' user.  It is very
  2076.      dangerous as any user with `FILE' privileges will be able to
  2077.      create files as `root' (for example, `~root/.bashrc'). To prevent
  2078.      this `mysqld' will refuse to run as `root' unless it is specified
  2079.      directly via `--user=root' option.
  2080.      `mysqld' can be run as any user instead.  You can also create a new
  2081.      Unix user `mysql' to make everything even more secure.  If you run
  2082.      `mysqld' as another Unix user, you don't need to change the `root'
  2083.      user name in the `user' table, because *MySQL* user names have
  2084.      nothing to do with Unix user names.  You can edit the
  2085.      `mysql.server' script to start `mysqld' as another Unix user.
  2086.      Normally this is done with the `su' command.  For more details, see
  2087.      *Note Changing *MySQL* user: Changing MySQL user.
  2088.    * If you put a password for the Unix `root' user in the
  2089.      `mysql.server' script, make sure this script is readable only by
  2090.      `root'.
  2091.    * Check that the Unix user that `mysqld' runs as is the only user
  2092.      with read/write privileges in the database directories.
  2093.    * On Unix platforms, do not run `mysqld' as root unless you really
  2094.      need to. Consider creating a user named `mysql' for that purpose.
  2095.    * Don't give the *process* privilege to all users.  The output of
  2096.      `mysqladmin processlist' shows the text of the currently executing
  2097.      queries, so any user who is allowed to execute that command might
  2098.      be able to see if another user issues an `UPDATE user SET
  2099.      password=PASSWORD('not_secure')' query.
  2100.      `mysqld' reserves an extra connection for users who have the
  2101.      *process* privilege, so that a *MySQL* `root' user can log in and
  2102.      check things even if all normal connections are in use.
  2103.    * Don't give the *file* privilege to all users.  Any user that has
  2104.      this privilege can write a file anywhere in the file system with
  2105.      the privileges of the `mysqld' daemon!  To make this a bit safer,
  2106.      all files generated with `SELECT ... INTO OUTFILE' are readable to
  2107.      everyone, and you can't overwrite existing files.
  2108.      The *file* privilege may also be used to read any file accessible
  2109.      to the Unix user that the server runs as.  This could be abused,
  2110.      for example, by using `LOAD DATA' to load `/etc/passwd' into a
  2111.      table, which can then be read with `SELECT'.
  2112.    * If you don't trust your DNS, you should use IP numbers instead of
  2113.      hostnames in the grant tables.  In principle, the `--secure'
  2114.      option to `mysqld' should make hostnames safe.  In any case, you
  2115.      should be very careful about creating grant table entries using
  2116.      hostname values that contain wild cards!
  2117.    * If you want to restrict the number of connections for a single
  2118.      user, you can do this by setting the `max_user_connections'
  2119.      variable in `mysqld'.
  2120. Startup options to mysqld which concerns security
  2121. =================================================
  2122. The following `mysqld' options affect networking security:
  2123. `--secure'
  2124.      IP numbers returned by the `gethostbyname()' system call are
  2125.      checked to make sure they resolve back to the original hostname.
  2126.      This makes it harder for someone on the outside to get access by
  2127.      pretending to be another host.  This option also adds some sanity
  2128.      checks of hostnames.  The option is turned off by default in
  2129.      *MySQL* Version 3.21 because sometimes it takes a long time to
  2130.      perform backward resolutions.  *MySQL* Version 3.22 caches
  2131.      hostnames and has this option enabled by default.
  2132. `--skip-grant-tables'
  2133.      This option causes the server not to use the privilege system at
  2134.      all. This gives everyone _full access_ to all databases!  (You can
  2135.      tell a running server to start using the grant tables again by
  2136.      executing `mysqladmin flush-privileges' or `mysqladmin reload'.)
  2137. `--skip-name-resolve'
  2138.      Hostnames are not resolved.  All `Host' column values in the grant
  2139.      tables must be IP numbers or `localhost'.
  2140. `--skip-networking'
  2141.      Don't allow TCP/IP connections over the network.  All connections
  2142.      to `mysqld' must be made via Unix sockets. This option is
  2143.      unsuitable for systems that use MIT-pthreads, because the
  2144.      MIT-pthreads package doesn't support Unix sockets.
  2145. `--skip-show-database'
  2146.      `SHOW DATABASE' command doesn't return anything.
  2147. `--safe-show-database'
  2148.      `SHOW DATABASE' only returns databases for which the user have
  2149.      some kind of privilege.
  2150. What the Privilege System Does
  2151. ==============================
  2152. The primary function of the *MySQL* privilege system is to authenticate
  2153. a user connecting from a given host, and to associate that user with
  2154. privileges on a database such as *select*, *insert*, *update* and
  2155. *delete*.
  2156. Additional functionality includes the ability to have an anonymous user
  2157. and to grant privileges for *MySQL*-specific functions such as `LOAD
  2158. DATA INFILE' and administrative operations.
  2159. MySQL User Names and Passwords
  2160. ==============================
  2161. There are several distinctions between the way user names and passwords
  2162. are used by *MySQL* and the way they are used by Unix or Windows:
  2163.    * User names, as used by *MySQL* for authentication purposes, have
  2164.      nothing to do with Unix user names (login names) or Windows user
  2165.      names.  Most *MySQL* clients by default try to log in using the
  2166.      current Unix user name as the *MySQL* user name, but that is for