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

MySQL数据库

开发平台:

Visual C++

  1. something is using the TCP/IP port @code{mysqld} is trying to use.
  2. See @ref{mysql_install_db} and @ref{Multiple servers}.
  3. If @code{mysqld} is currently running, you can find out what path settings
  4. it is using by executing this command:
  5. @example
  6. shell> mysqladmin variables
  7. or
  8. shell> mysqladmin -h 'your-host-name' variables
  9. @end example
  10. If @code{safe_mysqld} starts the server but you can't connect to it,
  11. you should make sure you have an entry in @file{/etc/hosts} that looks like
  12. this:
  13. @example
  14. 127.0.0.1       localhost
  15. @end example
  16. This problem occurs only on systems that don't have a working thread
  17. library and for which @strong{MySQL} must be configured to use MIT-pthreads.
  18. On Windows, you can try to start @code{mysqld} as follows:
  19. @example
  20. C:mysqlbinmysqld --standalone --debug
  21. @end example
  22. This will not run in the background and it should also write a trace in
  23. @file{mysqld.trace}, which may help you determine the source of your
  24. problems. @xref{Windows}.
  25. If you are using BDB (Berkeley DB) tables, you should familiarize
  26. yourself with the different BDB specific startup options. @xref{BDB start}.
  27. If you are using Gemini tables, refer to the Gemini-specific startup options.
  28. @xref{GEMINI start}.
  29. If you are using Innobase tables, refer to the Innobase-specific startup
  30. options. @xref{INNOBASE start}.
  31. @node Automatic start, Command-line options, Starting server, Post-installation
  32. @subsection Starting and Stopping MySQL Automatically
  33. @cindex starting, the server automatically
  34. @cindex stopping, the server
  35. @cindex server, starting and stopping
  36. The @code{mysql.server} script can be used to start or stop the server
  37. by invoking it with @code{start} or @code{stop} arguments:
  38. @example
  39. shell> mysql.server start
  40. shell> mysql.server stop
  41. @end example
  42. @code{mysql.server} can be found in the @file{share/mysql} directory
  43. under the @strong{MySQL} installation directory or in the @file{support-files}
  44. directory of the @strong{MySQL} source tree.
  45. Before @code{mysql.server} starts the server, it changes directory to
  46. the @strong{MySQL} installation directory, then invokes
  47. @code{safe_mysqld}.  You might need to edit @code{mysql.server} if you
  48. have a binary distribution that you've installed in a non-standard
  49. location.  Modify it to @code{cd} into the proper directory before it
  50. runs @code{safe_mysqld}. If you want the server to run as some specific
  51. user, you can change the @code{mysql_daemon_user=root} line to use
  52. another user.  You can also modify @code{mysql.server} to pass other
  53. options to @code{safe_mysqld}.
  54. @code{mysql.server stop} brings down the server by sending a signal to it.
  55. You can take down the server manually by executing @code{mysqladmin shutdown}.
  56. You might want to add these start and stop commands to the appropriate places
  57. in your @file{/etc/rc*} files when you start using @strong{MySQL} for
  58. production applications.  Note that if you modify @code{mysql.server}, then
  59. upgrade @strong{MySQL} sometime, your modified version will be overwritten,
  60. so you should make a copy of your edited version that you can reinstall.
  61. If your system uses @file{/etc/rc.local} to start external scripts, you
  62. should append the following to it:
  63. @example
  64. /bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
  65. @end example
  66. You can also add options for @code{mysql.server} in a global
  67. @file{/etc/my.cnf} file.  A typical @file{/etc/my.cnf} file might look like
  68. this:
  69. @example
  70. [mysqld]
  71. datadir=/usr/local/mysql/var
  72. socket=/tmp/mysqld.sock
  73. port=3306
  74. [mysql.server]
  75. user=mysql
  76. basedir=/usr/local/mysql
  77. @end example
  78. The @code{mysql.server} script uses the following variables:
  79. @code{user}, @code{datadir}, @code{basedir}, @code{bindir}, and
  80. @code{pid-file}.
  81. The following table shows which option sections each of the startup script
  82. uses:
  83. @multitable @columnfractions .20 .80
  84. @item @code{mysqld} @tab @code{mysqld} and @code{server}
  85. @item @code{mysql.server} @tab @code{mysql.server}, @code{mysqld} and @code{server}
  86. @item @code{safe_mysqld} @tab @code{mysql.server}, @code{mysqld} and @code{server}
  87. @end multitable
  88. @xref{Option files}.
  89. @findex command-line options
  90. @cindex options, command-line
  91. @cindex mysqld options
  92. @node Command-line options, Option files, Automatic start, Post-installation
  93. @subsection Command-line Options
  94. @code{mysqld} accepts the following command-line options:
  95. @table @code
  96. @item --ansi
  97. Use ANSI SQL syntax instead of MySQL syntax. @xref{ANSI mode}.
  98. @item -b, --basedir=path
  99. Path to installation directory. All paths are
  100. usually resolved relative to this.
  101. @item --big-tables
  102. Allow big result sets by saving all temporary sets on file. It solves
  103. most 'table full' errors, but also slows down the queries where
  104. in-memory tables would suffice. Since Version 3.23.2, @strong{MySQL} is
  105. able to solve it automaticaly by using memory for small temporary
  106. tables and switching to disk tables where necessary.
  107. @item --bind-address=IP
  108. IP address to bind to.
  109. @item --character-sets-dir=path
  110. Directory where character sets are. @xref{Character sets}.
  111. @item --chroot=path
  112. Chroot mysqld daemon during startup.
  113. Recommended security measure. It will somewhat limit @code{LOAD DATA INFILE}
  114. and @code{SELECT ... INTO OUTFILE} though.
  115. @item -h, --datadir=path
  116. Path to the database root.
  117. @item --default-character-set=charset
  118. Set the default character set. @xref{Character sets}.
  119. @item --default-table-type=type
  120. Set the default table type for tables. @xref{Table types}.
  121. @item --delay-key-write-for-all-tables
  122. Don't flush key buffers between writes for any @code{MyISAM} table.
  123. @xref{Server parameters}.
  124. @item --enable-locking
  125. Enable system locking.  Note that if you use this option on a system
  126. which a not fully working lockd() (as on Linux) you will easily get
  127. mysqld to deadlock.
  128. @item -T, --exit-info
  129. This is a bit mask of different flags one can use for debugging the
  130. mysqld server;  One should not use this option if one doesn't know
  131. exactly what it does!
  132. @item --flush
  133. Flush all changes to disk after each SQL command.  Normally @strong{MySQL}
  134. only does a write of all changes to disk after each SQL command and lets
  135. the operating system handle the syncing to disk.
  136. @xref{Crashing}.
  137. @item -?, --help
  138. Display short help and exit.
  139. @item --init-file=file
  140. Read SQL commands from this file at startup.
  141. @item -L, --language=...
  142. Client error messages in given language. May be given as a full path.
  143. @xref{Languages}.
  144. @item -l, --log[=file]
  145. Log connections and queries to file. @xref{Query log}.
  146. @item --log-isam[=file]
  147. Log all ISAM/MyISAM changes to file (only used when debugging ISAM/MyISAM).
  148. @item --log-slow-queries[=file]
  149. Log all queries that have taken more than @code{long_query_time} seconds to
  150. execute to file. @xref{Slow query log}.
  151. @item --log-update[=file]
  152. Log updates to @code{file.#} where @code{#} is a unique number if not given.
  153. @xref{Update log}.
  154. @item --log-long-format
  155. Log some extra information to update log.  If you are using
  156. @code{--log-slow-queries} then queries that are not using indexes are logged
  157. to the slow query log.
  158. @item --low-priority-updates
  159. Table-modifying operations (@code{INSERT}/@code{DELETE}/@code{UPDATE})
  160. will have lower priority than selects.
  161. It can also be done via @code{@{INSERT | REPLACE | UPDATE | DELETE@}
  162. LOW_PRIORITY ...} to lower the priority of only one query, or by
  163. @code{SET OPTION SQL_LOW_PRIORITY_UPDATES=1} to change the
  164. priority in one thread.
  165. @xref{Table locking}.
  166. @item --memlock
  167. Lock the @code{mysqld} process in memory.  This works only if your system
  168. supports the @code{mlockall()} system call.  This may help if you have
  169. a problem where the operating system is causing @code{mysqld} to swap on disk.
  170. @item --myisam-recover [=option[,option...]]] where option is one of DEFAULT, BACKUP, FORCE or QUICK.
  171. If this option is used, @code{mysqld} will on open check if the table is
  172. marked as crashed or if if the table wasn't closed properly
  173. (The last option only works if you are running with @code{--skip-locking}).
  174. If this is the case mysqld will run check on the table. If the table was
  175. corrupted, @code{mysqld} will attempt to repair it.
  176. The following options affects how the repair works.
  177. @multitable @columnfractions .3 .7
  178. @item DEFAULT @tab The same as not giving any option to @code{--myisam-recover}.
  179. @item BACKUP @tab If the data table was changed during recover, save a backup of the @file{table_name.MYD} data file as @file{table_name-datetime.BAK}.
  180. @item FORCE @tab Run recover even if we will loose more than one row from the .MYD file.
  181. @item QUICK @tab Don't check the rows in the table if there isn't any delete blocks.
  182. @end multitable
  183. Before a table is automaticly repaired, mysqld will add a note about
  184. this in the error log.  If you want to be able to recover from most
  185. things without user intervention, you should use the options
  186. @code{BACKUP,FORCE}.  This will force a repair of a table even if some rows
  187. would be deleted, but it will keep the old data file as a backup so that
  188. you can later examine what happened.
  189. @item --pid-file=path
  190. Path to pid file used by @code{safe_mysqld}.
  191. @item -P, --port=...
  192. Port number to listen for TCP/IP connections.
  193. @item -o, --old-protocol
  194. Use the 3.20 protocol for compatibility with some very old clients.
  195. @xref{Upgrading-from-3.20}.
  196. @item --one-thread
  197. Only use one thread (for debugging under Linux). @xref{Debugging server}.
  198. @item -O, --set-variable var=option
  199. Give a variable a value. @code{--help} lists variables.
  200. You can find a full description for all variables in the @code{SHOW VARIABLES}
  201. section in this manual. @xref{SHOW VARIABLES}.
  202. The tuning server parameters section includes information of how to optimize
  203. these. @xref{Server parameters}.
  204. @item --safe-mode
  205. Skip some optimize stages.
  206. Implies @code{--skip-delay-key-write}.
  207. @item --safe-show-database
  208. Don't show databases for which the user doesn't have any privileges.
  209. @item --secure
  210. IP numbers returned by the @code{gethostbyname()} system call are
  211. checked to make sure they resolve back to the original hostname. This
  212. makes it harder for someone on the outside to get access by pretending
  213. to be another host. This option also adds some sanity checks of
  214. hostnames. The option is turned off by default in @strong{MySQL} Version 3.21
  215. because sometimes it takes a long time to perform backward resolutions.
  216. @strong{MySQL} Version 3.22 caches hostnames (unless @code{--skip-host-cache}
  217. is used) and has this option enabled by default.
  218. @item --skip-concurrent-insert
  219. Turn off the ability to select and insert at the same time on @code{MyISAM}
  220. tables. (This is only to be used if you think you have found a bug
  221. in this feature).
  222. @item --skip-delay-key-write
  223. Ignore the @code{delay_key_write} option for all tables.
  224. @xref{Server parameters}.
  225. @item -Sg, --skip-grant-tables
  226. This option causes the server not to use the privilege system at all. This
  227. gives everyone @emph{full access} to all databases!  (You can tell a running
  228. server to start using the grant tables again by executing @code{mysqladmin
  229. flush-privileges} or @code{mysqladmin reload}.)
  230. @item --skip-locking
  231. Don't use system locking. To use @code{isamchk} or @code{myisamchk} you must
  232. shut down the server. @xref{Stability}.  Note that in @strong{MySQL} Version
  233. 3.23 you can use @code{REPAIR} and @code{CHECK} to repair/check @code{MyISAM}
  234. tables.
  235. @item --skip-name-resolve
  236. Hostnames are not resolved.  All @code{Host} column values in the grant
  237. tables must be IP numbers or @code{localhost}. @xref{DNS}.
  238. @item --skip-networking
  239. Don't listen for TCP/IP connections at all.
  240. All interaction with @code{mysqld} must be made via Unix sockets.
  241. This option is highly recommended for systems where only local requests
  242. are allowed. @xref{DNS}.
  243. @item --skip-new
  244. Don't use new, possible wrong routines.
  245. Implies @code{--skip-delay-key-write}.
  246. This will also set default table type to @code{ISAM}. @xref{ISAM}.
  247. @item --skip-host-cache
  248. Never use host name cache for faster name-ip resolution, but query
  249. DNS server on every connect instead. @xref{DNS}.
  250. @item --skip-show-database
  251. Don't allow 'SHOW DATABASE' commands, unless the user has
  252. @strong{process} privilege.
  253. @item --skip-thread-priority
  254. Disable using thread priorities for faster response time.
  255. @item --socket=path
  256. Socket file to use for local connections instead of default
  257. @code{/tmp/mysql.sock}.
  258. @item -t, --tmpdir=path
  259. Path for temporary files. It may be useful if your default @code{/tmp}
  260. directory resides on a partition too small to hold temporary tables.
  261. @item -u, --user=user_name
  262. Run @code{mysqld} daemon as user @code{user_name}. This option is
  263. @emph{mandatory} when starting @code{mysqld} as root.
  264. @item -V, --version
  265. Output version information and exit.
  266. @end table
  267. @cindex default options
  268. @cindex option files
  269. @cindex creating, default startup options
  270. @cindex startup options, default
  271. @node Option files,  , Command-line options, Post-installation
  272. @subsection Option Files
  273. @strong{MySQL} Version 3.22 can read default startup options for the
  274. server and for clients from option files.
  275. @strong{MySQL} reads default options from the following files on Unix:
  276. @tindex .my.cnf file
  277. @multitable @columnfractions .3 .7
  278. @item @strong{Filename} @tab @strong{Purpose}
  279. @item @code{/etc/my.cnf} @tab Global options
  280. @item @code{DATADIR/my.cnf} @tab Server-specific options
  281. @item @code{defaults-extra-file} @tab The file specified with --defaults-extra-file=#
  282. @item @code{~/.my.cnf} @tab User-specific options
  283. @end multitable
  284. @code{DATADIR} is the @strong{MySQL} data directory (typically
  285. @file{/usr/local/mysql/data} for a binary installation or
  286. @file{/usr/local/var} for a source installation).  Note that this is the
  287. directory that was specified at configuration time, not the one specified
  288. with @code{--datadir} when @code{mysqld} starts up!  (@code{--datadir} has no
  289. effect on where the server looks for option files, because it looks for them
  290. before it processes any command-line arguments.)
  291. @strong{MySQL} reads default options from the following files on Windows:
  292. @multitable @columnfractions .3 .7
  293. @item @strong{Filename} @tab @strong{Purpose}
  294. @item @code{windows-system-directorymy.ini} @tab Global options
  295. @item @code{C:my.cnf} @tab Global options
  296. @item @code{C:mysqldatamy.cnf} @tab Server-specific options
  297. @end multitable
  298. Note that on Windows, you should specify all paths with @code{/} instead of
  299. @code{}. If you use @code{}, you need to specify this twice, as
  300. @code{} is the escape character in @strong{MySQL}.
  301. @cindex Environment variables
  302. @strong{MySQL} tries to read option files in the order listed above.  If
  303. multiple option files exist, an option specified in a file read later takes
  304. precedence over the same option specified in a file read earlier.  Options
  305. specified on the command line take precedence over options specified in any
  306. option file.  Some options can be specified using environment variables.
  307. Options specified on the command line or in option files take precedence over
  308. environment variable values. @xref{Environment variables}.
  309. The following programs support option files:  @code{mysql},
  310. @code{mysqladmin}, @code{mysqld}, @code{mysqldump}, @code{mysqlimport},
  311. @code{mysql.server}, @code{myisamchk}, and @code{myisampack}.
  312. You can use option files to specify any long option that a program supports!
  313. Run the program with @code{--help} to get a list of available options.
  314. An option file can contain lines of the following forms:
  315. @table @code
  316. @item #comment
  317. Comment lines start with @samp{#} or @samp{;}. Empty lines are ignored.
  318. @item [group]
  319. @code{group} is the name of the program or group for which you want to set
  320. options.  After a group line, any @code{option} or @code{set-variable} lines
  321. apply to the named group until the end of the option file or another group
  322. line is given.
  323. @item option
  324. This is equivalent to @code{--option} on the command line.
  325. @item option=value
  326. This is equivalent to @code{--option=value} on the command line.
  327. @item set-variable = variable=value
  328. This is equivalent to @code{--set-variable variable=value} on the command line.
  329. This syntax must be used to set a @code{mysqld} variable.
  330. @end table
  331. The @code{client} group allows you to specify options that apply to all
  332. @strong{MySQL} clients (not @code{mysqld}). This is the perfect group to use
  333. to specify the password you use to connect to the server.  (But make
  334. sure the option file is readable and writable only to yourself.)
  335. Note that for options and values, all leading and trailing blanks are
  336. automatically deleted.  You may use the escape sequences @samp{b},
  337. @samp{t}, @samp{n}, @samp{r}, @samp{\}, and @samp{s} in your value string
  338. (@samp{s} == blank).
  339. Here is a typical global option file:
  340. @example
  341. [client]
  342. port=3306
  343. socket=/tmp/mysql.sock
  344. [mysqld]
  345. port=3306
  346. socket=/tmp/mysql.sock
  347. set-variable = key_buffer_size=16M
  348. set-variable = max_allowed_packet=1M
  349. [mysqldump]
  350. quick
  351. @end example
  352. Here is typical user option file:
  353. @example
  354. [client]
  355. # The following password will be sent to all standard MySQL clients
  356. password=my_password
  357. [mysql]
  358. no-auto-rehash
  359. set-variable = connect_timeout=2
  360. [mysql-hot-copy]
  361. interactive-timeout
  362. @end example
  363. @tindex .my.cnf file
  364. If you have a source distribution, you will find sample configuration
  365. files named @file{my-xxxx.cnf} in the @file{support-files} directory.
  366. If you have a binary distribution, look in the @file{DIR/share/mysql}
  367. directory, where @code{DIR} is the pathname to the @strong{MySQL}
  368. installation directory (typically @file{/usr/local/mysql}).  Currently
  369. there are sample configuration files for small, medium, large, and very
  370. large systems.  You can copy @file{my-xxxx.cnf} to your home directory
  371. (rename the copy to @file{.my.cnf}) to experiment with this.
  372. All @strong{MySQL} clients that support option files support the
  373. following options:
  374. @multitable @columnfractions .40 .60
  375. @item --no-defaults @tab Don't read any option files.
  376. @item --print-defaults @tab Print the program name and all options that it will get.
  377. @item --defaults-file=full-path-to-default-file @tab Only use the given configuration file.
  378. @item --defaults-extra-file=full-path-to-default-file @tab Read this configuration file after the global configuration file but before the user configuration file.
  379. @end multitable
  380. Note that the above options must be first on the command line to work!
  381. @code{--print-defaults} may however be used directly after the
  382. @code{--defaults-xxx-file} commands.
  383. Note for developers:  Option file handling is implemented simply by
  384. processing all matching options (that is, options in the appropriate group)
  385. before any command-line arguments. This works nicely for programs that use
  386. the last instance of an option that is specified multiple times. If you have
  387. an old program that handles multiply-specified options this way but doesn't
  388. read option files, you need add only two lines to give it that capability.
  389. Check the source code of any of the standard @strong{MySQL} clients to see
  390. how to do this.
  391. In shell scripts you can use the @file{my_print_defaults} command to parse the
  392. config files:
  393. @example
  394. shell> my_print_defaults client mysql
  395. --port=3306
  396. --socket=/tmp/mysql.sock
  397. --no-auto-rehash
  398. @end example
  399. The above output contains all options for the groups 'client' and 'mysql'.
  400. @node Installing many servers, Upgrade, Post-installation, Installing
  401. @section Installing many servers on the same machine
  402. @cindex post-install, many servers
  403. @cindex Installing many servers
  404. @cindex Starting many servers
  405. In some cases you may want to have many different @code{mysqld} deamons
  406. (servers) running on the same machine.  You may for example want to run
  407. a new version of @strong{MySQL} for testing together with an old version
  408. that is in production.  Another case is when you want to give different
  409. users access to different mysqld servers that they manage themself.
  410. One way to get a new server running is by starting it with a different
  411. socket and port as follows:
  412. @tindex MYSQL_UNIX_PORT environment variable
  413. @tindex MYSQL_TCP_PORT environment variable
  414. @tindex Environment variable, MYSQL_UNIX_PORT
  415. @tindex Environment variable, MYSQL_TCP_PORT
  416. @example
  417. shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
  418. shell> MYSQL_TCP_PORT=3307
  419. shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
  420. shell> scripts/mysql_install_db
  421. shell> bin/safe_mysqld &
  422. @end example
  423. The environment variables appendix includes a list of other environment
  424. variables you can use to affect @code{mysqld}. @xref{Environment variables}.
  425. The above is the quick and dirty way that one commonly use for testing.
  426. The nice thing with this is that all connections you do in the above shell
  427. will automaticly be directed to the new running server!
  428. If you need to do this more permanently, you should create an own option
  429. file for each server. @xref{Option files}.  In your startup script that
  430. is executed at boot time (mysql.server?) you should specify for both
  431. servers:
  432. @code{safe_mysqld --default-file=path-to-option-file}
  433. At least the following options should be different per server:
  434. @table @code
  435. @item port=#
  436. @item socket=path
  437. @item pid-file=path
  438. @end table
  439. The following options should be different, if they are used:
  440. @table @code
  441. @item log=path
  442. @item log-bin=path
  443. @item log-update=path
  444. @item log-isam=path
  445. @item bdb-logdir=path
  446. @end table
  447. If you want more performance, you can also specify the following differently:
  448. @table @code
  449. @item tmpdir=path
  450. @item bdb-tmpdir=path
  451. @end table
  452. @xref{Command-line options}.
  453. If you are installing binary @strong{MySQL} versions (.tar files) and
  454. start them with @code{./bin/safe_mysqld} then in most cases the only
  455. option you need to add/change is the @code{socket} and @code{port}
  456. argument to @code{safe_mysqld}.
  457. @node Upgrade,  , Installing many servers, Installing
  458. @section Upgrading/Downgrading MySQL
  459. @cindex upgrading
  460. @cindex downgrading
  461. You can always move the @strong{MySQL} form and data files between
  462. different versions on the same architecture as long as you have the same
  463. base version of @strong{MySQL}. The current base version is
  464. 3. If you change the character set when running @strong{MySQL} (which may
  465. also change the sort order), you must run @code{myisamchk -r -q} on all
  466. tables.  Otherwise your indexes may not be ordered correctly.
  467. If you are afraid of new versions, you can always rename your old
  468. @code{mysqld} to something like @code{mysqld}-'old-version-number'.  If
  469. your new @code{mysqld} then does something unexpected, you can simply shut it
  470. down and restart with your old @code{mysqld}!
  471. When you do an upgrade you should also back up your old databases, of course.
  472. If after an upgrade, you experience problems with recompiled client programs,
  473. like @code{Commands out of sync} or unexpected core dumps, you probably have
  474. used an old header or library file when compiling your programs.  In this
  475. case you should check the date for your @file{mysql.h} file and
  476. @file{libmysqlclient.a} library to verify that they are from the new
  477. @strong{MySQL} distribution.  If not, please recompile your programs!
  478. If you get some problems that the new @code{mysqld} server doesn't want to
  479. start or that you can't connect without a password, check that you don't
  480. have some old @file{my.cnf} file from your old installation!  You can
  481. check this with: @code{program-name --print-defaults}.  If this outputs
  482. anything other than the program name, you have an active @code{my.cnf}
  483. file that will may affect things!
  484. It is a good idea to rebuild and reinstall the @code{Msql-Mysql-modules}
  485. distribution whenever you install a new release of @strong{MySQL},
  486. particularly if you notice symptoms such as all your @code{DBI} scripts
  487. dumping core after you upgrade @strong{MySQL}.
  488. @menu
  489. * Upgrading-from-3.22::         Upgrading from a 3.22 version to 3.23
  490. * Upgrading-from-3.21::         Upgrading from a 3.21 version to 3.22
  491. * Upgrading-from-3.20::         Upgrading from a 3.20 version to 3.21
  492. * Upgrading-to-arch::           Upgrading to another architecture
  493. @end menu
  494. @cindex compatibility, between MySQL versions
  495. @cindex upgrading, 3.22 to 3.23
  496. @node Upgrading-from-3.22, Upgrading-from-3.21, Upgrade, Upgrade
  497. @subsection Upgrading From Version 3.22 to Version 3.23
  498. @strong{MySQL} Version 3.23 supports tables of the new @code{MyISAM} type and
  499. the old @code{ISAM} type.  You don't have to convert your old tables to
  500. use these with Version 3.23.  By default, all new tables will be created with
  501. type @code{MyISAM} (unless you start @code{mysqld} with the
  502. @code{--default-table-type=isam} option). You can change an @code{ISAM}
  503. table to a @code{MyISAM} table with @code{ALTER TABLE} or the Perl script
  504. @code{mysql_convert_table_format}.
  505. Version 3.22 and 3.21 clients will work without any problems with a Version
  506. 3.23 server.
  507. The following lists tell what you have to watch out for when upgrading to
  508. Version 3.23:
  509. @itemize @bullet
  510. @item
  511. If you do a @code{DROP DATABASE} on a symbolic linked database, both the
  512. link and the original database is deleted.  (This didn't happen in 3.22
  513. because configure didn't detect the @code{readlink} system call).
  514. @item
  515. @code{OPTIMIZE TABLE} now only works for @strong{MyISAM} tables.
  516. For other table types, you can use @code{ALTER TABLE} to optimize the table.
  517. During @code{OPTIMIZE TABLE} the table is now locked from other threads.
  518. @item
  519. The @strong{MySQL} client @code{mysql} is now by default started with the
  520. option @code{--no-named-commands (-g)}. This option can be disabled with
  521. @code{--enable-named-commands (-G)}. This may cause incompatibility problems in
  522. some cases, for example in SQL scripts that use named commands without a
  523. semicolon!  Long format commands still work from the first line.
  524. @item
  525. If you are using the @code{german} character sort order, you must repair
  526. all your tables with @code{isamchk -r}, as we have made some changes in
  527. the sort order!
  528. @item The default return type of @code{IF} will now depend on both arguments
  529. and not only the first argument.
  530. @item @code{AUTO_INCREMENT} will not work with negative numbers. The reason
  531. for this is that negative numbers caused problems when wrapping from -1 to 0.
  532. @code{AUTO_INCREMENT} is now for MyISAM tables handled at a lower level and
  533. is much faster than before. For MyISAM tables old numbers are also not reused
  534. anymore, even if you delete some rows from the table.
  535. @item @code{CASE}, @code{DELAYED}, @code{ELSE}, @code{END}, @code{FULLTEXT}, @code{INNER}, @code{RIGHT}, @code{THEN} and @code{WHEN} are now reserved words.
  536. @item @code{FLOAT(X)} is now a true floating-point type and not a value with
  537. a fixed number of decimals.
  538. @item When declaring @code{DECIMAL(length,dec)} the length argument no
  539. longer includes a place for the sign or the decimal point.
  540. @item A @code{TIME} string must now be of one of the following formats:
  541. @code{[[[DAYS] [H]H:]MM:]SS[.fraction]} or
  542. @code{[[[[[H]H]H]H]MM]SS[.fraction]}
  543. @item @code{LIKE} now compares strings using the same character
  544. comparison rules as @code{'='}.  If you require the old behavior, you
  545. can compile @strong{MySQL} with the @code{CXXFLAGS=-DLIKE_CMP_TOUPPER}
  546. flag.
  547. @item @code{REGEXP} is now case insensitive for normal (not binary) strings.
  548. @item When you check/repair tables you should use @code{CHECK TABLE}
  549. or @code{myisamchk} for @code{MyISAM} tables (@code{.MYI}) and
  550. @code{isamchk} for ISAM (@code{.ISM}) tables.
  551. @item If you want your @code{mysqldump} files to be compatible between
  552. @strong{MySQL} Version 3.22 and Version 3.23, you should not use the
  553. @code{--opt} or @code{--full} option to @code{mysqldump}.
  554. @item Check all your calls to @code{DATE_FORMAT()} to make sure there is a
  555. @samp{%} before each format character.  (Later @strong{MySQL} Version 3.22
  556. did allow this syntax.)
  557. @item
  558. @code{mysql_fetch_fields_direct} is now a function (it was a macro) and
  559. it returns a pointer to a @code{MYSQL_FIELD} instead of a
  560. @code{MYSQL_FIELD}.
  561. @item
  562. @code{mysql_num_fields()} can no longer be used on a @code{MYSQL*} object (it's
  563. now a function that takes @code{MYSQL_RES*} as an argument. You should now
  564. use @code{mysql_field_count()} instead.
  565. @item
  566. In @strong{MySQL} Version 3.22, the output of @code{SELECT DISTINCT ...} was
  567. almost always sorted.  In Version 3.23, you must use @code{GROUP BY} or
  568. @code{ORDER BY} to obtain sorted output.
  569. @item
  570. @code{SUM()} now returns @code{NULL}, instead of 0, if there is no matching
  571. rows. This is according to ANSI SQL.
  572. @item An @code{AND} or @code{OR} with @code{NULL} values will now return
  573. @code{NULL} instead of 0. This mostly affects queries that use @code{NOT}
  574. on an @code{AND/OR} expression as @code{NOT NULL} = @code{NULL}.
  575. @code{LPAD()} and @code{RPAD()} will shorten the result string if it's longer
  576. than the length argument.
  577. @end itemize
  578. @cindex compatibility, between MySQL versions
  579. @node Upgrading-from-3.21, Upgrading-from-3.20, Upgrading-from-3.22, Upgrade
  580. @subsection Upgrading from Version 3.21 to Version 3.22
  581. @cindex upgrading, 3.21 to 3.22
  582. Nothing that affects compatibility has changed between Version 3.21 and 3.22.
  583. The only pitfall is that new tables that are created with @code{DATE} type
  584. columns will use the new way to store the date. You can't access these new
  585. fields from an old version of @code{mysqld}.
  586. After installing @strong{MySQL} Version 3.22, you should start the new server
  587. and then run the @code{mysql_fix_privilege_tables} script. This will add the
  588. new privileges that you need to use the @code{GRANT} command.  If you forget
  589. this, you will get @code{Access denied} when you try to use @code{ALTER
  590. TABLE}, @code{CREATE INDEX}, or @code{DROP INDEX}. If your @strong{MySQL} root
  591. user requires a password, you should give this as an argument to
  592. @code{mysql_fix_privilege_tables}.
  593. The C API interface to @code{mysql_real_connect()} has changed.  If you have
  594. an old client program that calls this function, you must place a @code{0} for
  595. the new @code{db} argument (or recode the client to send the @code{db}
  596. element for faster connections).  You must also call @code{mysql_init()}
  597. before calling @code{mysql_real_connect()}!  This change was done to allow
  598. the new @code{mysql_options()} function to save options in the @code{MYSQL}
  599. handler structure.
  600. The @code{mysqld} variable @code{key_buffer} has changed names to
  601. @code{key_buffer_size}, but you can still use the old name in your
  602. startup files.
  603. @node Upgrading-from-3.20, Upgrading-to-arch, Upgrading-from-3.21, Upgrade
  604. @subsection Upgrading from Version 3.20 to Version 3.21
  605. @cindex upgrading, 3.20 to 3.21
  606. If you are running a version older than Version 3.20.28 and want to
  607. switch to Version 3.21, you need to do the following:
  608. You can start the @code{mysqld} Version 3.21 server with @code{safe_mysqld
  609. --old-protocol} to use it with clients from a Version 3.20 distribution.
  610. In this case, the new client function @code{mysql_errno()} will not
  611. return any server error, only @code{CR_UNKNOWN_ERROR} (but it
  612. works for client errors), and the server uses the old @code{password()}
  613. checking rather than the new one.
  614. If you are @strong{NOT} using the @code{--old-protocol} option to
  615. @code{mysqld}, you will need to make the following changes:
  616. @itemize @bullet
  617. @item
  618. All client code must be recompiled. If you are using ODBC, you must get
  619. the new @strong{MyODBC} 2.x driver.
  620. @item
  621. The script @code{scripts/add_long_password} must be run to convert the
  622. @code{Password} field in the @code{mysql.user} table to @code{CHAR(16)}.
  623. @item
  624. All passwords must be reassigned in the @code{mysql.user} table (to get 62-bit
  625. rather than 31-bit passwords).
  626. @item
  627. The table format hasn't changed, so you don't have to convert any tables.
  628. @end itemize
  629. @strong{MySQL} Version 3.20.28 and above can handle the new @code{user} table
  630. format without affecting clients. If you have a @strong{MySQL} version earlier
  631. than Version 3.20.28, passwords will no longer work with it if you convert the
  632. @code{user} table. So to be safe, you should first upgrade to at least Version
  633. 3.20.28 and then upgrade to Version 3.21.
  634. @cindex Protocol mismatch
  635. The new client code works with a 3.20.x @code{mysqld} server, so
  636. if you experience problems with 3.21.x, you can use the old 3.20.x server
  637. without having to recompile the clients again.
  638. If you are not using the @code{--old-protocol} option to @code{mysqld},
  639. old clients will issue the error message:
  640. @example
  641. ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
  642. @end example
  643. The new Perl @code{DBI}/@code{DBD} interface also supports the old
  644. @code{mysqlperl} interface.  The only change you have to make if you use
  645. @code{mysqlperl} is to change the arguments to the @code{connect()} function.
  646. The new arguments are: @code{host}, @code{database}, @code{user},
  647. @code{password} (the @code{user} and @code{password} arguments have changed
  648. places).
  649. @xref{Perl DBI Class, , Perl @code{DBI} Class}.
  650. The following changes may affect queries in old applications:
  651. @itemize @bullet
  652. @item
  653. @code{HAVING} must now be specified before any @code{ORDER BY} clause.
  654. @item
  655. The parameters to @code{LOCATE()} have been swapped.
  656. @item
  657. There are some new reserved words. The most notable are @code{DATE},
  658. @code{TIME}, and @code{TIMESTAMP}.
  659. @end itemize
  660. @cindex upgrading, different architecture
  661. @node Upgrading-to-arch,  , Upgrading-from-3.20, Upgrade
  662. @subsection Upgrading to Another Architecture
  663. If you are using @strong{MySQL} Version 3.23, you can copy the @code{.frm},
  664. @code{.MYI}, and @code{.MYD} files between different architectures that
  665. support the same floating-point format.  (@strong{MySQL} takes care of any
  666. byte swapping issues.)
  667. The @strong{MySQL} @code{ISAM} data and index files (@file{.ISD} and
  668. @file{*.ISM}, respectively) are architecture-dependent and in some cases
  669. OS-dependent.  If you want to move your applications to another machine
  670. that has a different architecture or OS than your current machine, you
  671. should not try to move a database by simply copying the files to the
  672. other machine. Use @code{mysqldump} instead.
  673. By default, @code{mysqldump} will create a file full of SQL statements.
  674. You can then transfer the file to the other machine and feed it as input
  675. to the @code{mysql} client.
  676. Try @code{mysqldump --help} to see what options are available.
  677. If you are moving the data to a newer version of @strong{MySQL}, you should use
  678. @code{mysqldump --opt} with the newer version to get a fast, compact dump.
  679. The easiest (although not the fastest) way to move a database between two
  680. machines is to run the following commands on the machine on which the
  681. database is located:
  682. @example
  683. shell> mysqladmin -h 'other hostname' create db_name
  684. shell> mysqldump --opt db_name 
  685.         | mysql -h 'other hostname' db_name
  686. @end example
  687. If you want to copy a database from a remote machine over a slow network,
  688. you can use:
  689. @example
  690. shell> mysqladmin create db_name
  691. shell> mysqldump -h 'other hostname' --opt --compress db_name 
  692.         | mysql db_name
  693. @end example
  694. You can also store the result in a file, then transfer the file to the
  695. target machine and load the file into the database there.  For example,
  696. you can dump a database to a file on the source machine like this:
  697. @example
  698. shell> mysqldump --quick db_name | gzip > db_name.contents.gz
  699. @end example
  700. (The file created in this example is compressed.) Transfer the file
  701. containing the database contents to the target machine and run these commands
  702. there:
  703. @example
  704. shell> mysqladmin create db_name
  705. shell> gunzip < db_name.contents.gz | mysql db_name
  706. @end example
  707. @cindex @code{mysqldump}
  708. @cindex @code{mysqlimport}
  709. You can also use @code{mysqldump} and @code{mysqlimport} to accomplish
  710. the database transfer.
  711. For big tables, this is much faster than simply using @code{mysqldump}.
  712. In the commands shown below, @code{DUMPDIR} represents the full pathname
  713. of the directory you use to store the output from @code{mysqldump}.
  714. First, create the directory for the output files and dump the database:
  715. @example
  716. shell> mkdir DUMPDIR
  717. shell> mysqldump --tab=DUMPDIR db_name
  718. @end example
  719. Then transfer the files in the @code{DUMPDIR} directory to some corresponding
  720. directory on the target machine and load the files into @strong{MySQL}
  721. there:
  722. @example
  723. shell> mysqladmin create db_name           # create database
  724. shell> cat DUMPDIR/*.sql | mysql db_name   # create tables in database
  725. shell> mysqlimport db_name DUMPDIR/*.txt   # load data into tables
  726. @end example
  727. Also, don't forget to copy the @code{mysql} database, because that's where the
  728. grant tables (@code{user}, @code{db}, @code{host}) are stored.  You may have
  729. to run commands as the @strong{MySQL} @code{root} user on the new machine
  730. until you have the @code{mysql} database in place.
  731. After you import the @code{mysql} database on the new machine, execute
  732. @code{mysqladmin flush-privileges} so that the server reloads the grant table
  733. information.
  734. @cindex compatibility, with ANSI SQL
  735. @cindex standards compatibility
  736. @cindex extensions, to ANSI SQL
  737. @cindex ANSI SQL92, extensions to
  738. @node Compatibility, Privilege system, Installing, Top
  739. @chapter How Standards-compatible Is MySQL?
  740. @menu
  741. * Extensions to ANSI::          @strong{MySQL} extensions to ANSI SQL92
  742. * ANSI mode::                   Running @strong{MySQL} in ANSI mode
  743. * Differences from ANSI::       @strong{MySQL} differences compared to ANSI SQL92
  744. * Missing functions::           Functionality missing from @strong{MySQL}
  745. * Standards::                   What standards does @strong{MySQL} follow?
  746. * Commit-rollback::             How to cope without @code{COMMIT}-@code{ROLLBACK}
  747. @end menu
  748. @node Extensions to ANSI, ANSI mode, Compatibility, Compatibility
  749. @section MySQL Extensions to ANSI SQL92
  750. @strong{MySQL} includes some extensions that you probably will not find in
  751. other SQL databases.  Be warned that if you use them, your code will not be
  752. portable to other SQL servers.  In some cases, you can write code that
  753. includes @strong{MySQL} extensions, but is still portable, by using comments
  754. of the form @code{/*! ... */}.  In this case, @strong{MySQL} will parse and
  755. execute the code within the comment as it would any other @strong{MySQL}
  756. statement, but other SQL servers will ignore the extensions.  For example:
  757. @example
  758. SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
  759. @end example
  760. If you add a version number after the @code{'!'}, the syntax will only be
  761. executed if the @strong{MySQL} version is equal to or newer than the used
  762. version number:
  763. @example
  764. CREATE /*!32302 TEMPORARY */ TABLE (a int);
  765. @end example
  766. The above means that if you have Version 3.23.02 or newer, then @strong{MySQL}
  767. will use the @code{TEMPORARY} keyword.
  768. @strong{MySQL} extensions are listed below:
  769. @itemize @bullet
  770. @item
  771. The field types @code{MEDIUMINT}, @code{SET}, @code{ENUM}, and the
  772. different @code{BLOB} and @code{TEXT} types.
  773. @item
  774. The field attributes @code{AUTO_INCREMENT}, @code{BINARY}, @code{NULL},
  775. @code{UNSIGNED}, and @code{ZEROFILL}.
  776. @item
  777. All string comparisons are case insensitive by default, with sort
  778. ordering determined by the current character set (ISO-8859-1 Latin1 by
  779. default).  If you don't like this, you should declare your columns with
  780. the @code{BINARY} attribute or use the @code{BINARY} cast, which causes
  781. comparisons to be done according to the ASCII order used on the
  782. @strong{MySQL} server host.
  783. @item
  784. @strong{MySQL} maps each database to a directory under the @strong{MySQL}
  785. data directory, and tables within a database to filenames in the database
  786. directory.
  787. This has a few implications:
  788. @cindex database names, case sensitivity
  789. @cindex table names, case sensitivity
  790. @cindex case sensitivity, of database names
  791. @cindex case sensitivity, of table names
  792. @itemize @minus
  793. @item
  794. Database names and table names are case sensitive in @strong{MySQL} on
  795. operating systems that have case-sensitive filenames (like most Unix
  796. systems). @xref{Name case sensitivity}.
  797. @item
  798. Database, table, index, column, or alias names may begin with a digit
  799. (but may not consist solely of digits).
  800. @item
  801. You can use standard system commands to backup, rename, move, delete, and copy
  802. tables.  For example, to rename a table, rename the @file{.MYD}, @file{.MYI},
  803. and @file{.frm} files to which the table corresponds.
  804. @end itemize
  805. @item
  806. In SQL statements, you can access tables from different databases
  807. with the @code{db_name.tbl_name} syntax.  Some SQL servers provide
  808. the same functionality but call this @code{User space}.
  809. @strong{MySQL} doesn't support tablespaces as in:
  810. @code{create table ralph.my_table...IN my_tablespace}.
  811. @item
  812. @code{LIKE} is allowed on numeric columns.
  813. @item
  814. Use of @code{INTO OUTFILE} and @code{STRAIGHT_JOIN} in a @code{SELECT}
  815. statement. @xref{SELECT, , @code{SELECT}}.
  816. @item
  817. The @code{SQL_SMALL_RESULT} option in a @code{SELECT} statement.
  818. @item
  819. @code{EXPLAIN SELECT} to get a description on how tables are joined.
  820. @item
  821. Use of index names, indexes on a prefix of a field, and use of
  822. @code{INDEX} or @code{KEY} in a @code{CREATE TABLE}
  823. statement. @xref{CREATE TABLE, , @code{CREATE TABLE}}.
  824. @item
  825. Use of @code{TEMPORARY} or @code{IF NOT EXISTS} with @code{CREATE TABLE}.
  826. @item
  827. Use of @code{COUNT(DISTINCT list)} where 'list' is more than one element.
  828. @item
  829. Use of @code{CHANGE col_name}, @code{DROP col_name}, or @code{DROP
  830. INDEX}, @code{IGNORE} or @code{RENAME} in an @code{ALTER TABLE}
  831. statement. @xref{ALTER TABLE, , @code{ALTER TABLE}}.
  832. @item
  833. Use of @code{RENAME TABLE}. @xref{RENAME TABLE, , @code{RENAME TABLE}}.
  834. @item
  835. Use of multiple @code{ADD}, @code{ALTER}, @code{DROP}, or @code{CHANGE}
  836. clauses in an @code{ALTER TABLE} statement.
  837. @item
  838. Use of @code{DROP TABLE} with the keywords @code{IF EXISTS}.
  839. @item
  840. You can drop multiple tables with a single @code{DROP TABLE} statement.
  841. @item
  842. The @code{LIMIT} clause of the @code{DELETE} statement.
  843. @item
  844. The @code{DELAYED} clause of the @code{INSERT} and @code{REPLACE}
  845. statements.
  846. @item
  847. The @code{LOW_PRIORITY} clause of the @code{INSERT}, @code{REPLACE},
  848. @code{DELETE}, and @code{UPDATE} statements.
  849. @cindex Oracle compatibility
  850. @cindex compatibility, with Oracle
  851. @item
  852. Use of @code{LOAD DATA INFILE}. In many cases, this syntax is compatible with
  853. Oracle's @code{LOAD DATA INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.
  854. @item
  855. The @code{ANALYZE TABLE}, @code{CHECK TABLE}, @code{OPTIMIZE TABLE}, and
  856. @code{REPAIR TABLE} statements.
  857. @item
  858. The @code{SHOW} statement.
  859. @xref{SHOW, , @code{SHOW}}.
  860. @item
  861. Strings may be enclosed by either @samp{"} or @samp{'}, not just by @samp{'}.
  862. @item
  863. Use of the escape @samp{} character.
  864. @item
  865. The @code{SET OPTION} statement. @xref{SET OPTION, , @code{SET OPTION}}.
  866. @item
  867. You don't need to name all selected columns in the @code{GROUP BY} part.
  868. This gives better performance for some very specific, but quite normal
  869. queries.
  870. @xref{Group by functions}.
  871. @item
  872. One can specify @code{ASC} and @code{DESC} with @code{GROUP BY}.
  873. @item
  874. To make it easier for users who come from other SQL environments,
  875. @strong{MySQL} supports aliases for many functions. For example, all
  876. string functions support both ANSI SQL syntax and ODBC syntax.
  877. @item
  878. @strong{MySQL} understands the @code{||} and @code{&&} operators to mean
  879. logical OR and AND, as in the C programming language.  In @strong{MySQL},
  880. @code{||} and @code{OR} are synonyms, as are @code{&&} and @code{AND}.
  881. Because of this nice syntax, @strong{MySQL} doesn't support
  882. the ANSI SQL @code{||} operator for string concatenation; use
  883. @code{CONCAT()} instead. Because @code{CONCAT()} takes any number
  884. of arguments, it's easy to convert use of the @code{||} operator to
  885. @strong{MySQL}.
  886. @item
  887. @code{CREATE DATABASE} or @code{DROP DATABASE}.
  888. @xref{CREATE DATABASE, , @code{CREATE DATABASE}}.
  889. @cindex PostgreSQL compatibility
  890. @cindex compatibility, with PostgreSQL
  891. @item
  892. The @code{%} operator is a synonym for @code{MOD()}.  That is,
  893. @code{N % M} is equivalent to @code{MOD(N,M)}.  @code{%} is supported
  894. for C programmers and for compatibility with PostgreSQL.
  895. @item
  896. The @code{=}, @code{<>}, @code{<=} ,@code{<}, @code{>=},@code{>},
  897. @code{<<}, @code{>>}, @code{<=>}, @code{AND}, @code{OR}, or @code{LIKE}
  898. operators may be used in column comparisons to the left of the
  899. @code{FROM} in @code{SELECT} statements.  For example:
  900. @example
  901. mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
  902. @end example
  903. @item
  904. The @code{LAST_INSERT_ID()} function.
  905. @xref{mysql_insert_id, , @code{mysql_insert_id()}}.
  906. @item
  907. The @code{REGEXP} and @code{NOT REGEXP} extended regular expression
  908. operators.
  909. @item
  910. @code{CONCAT()} or @code{CHAR()} with one argument or more than two
  911. arguments.  (In @strong{MySQL}, these functions can take any number of
  912. arguments.)
  913. @item The @code{BIT_COUNT()}, @code{CASE}, @code{ELT()},
  914. @code{FROM_DAYS()}, @code{FORMAT()}, @code{IF()}, @code{PASSWORD()},
  915. @code{ENCRYPT()}, @code{md5()}, @code{ENCODE()}, @code{DECODE()},
  916. @code{PERIOD_ADD()}, @code{PERIOD_DIFF()}, @code{TO_DAYS()}, or
  917. @code{WEEKDAY()} functions.
  918. @item
  919. Use of @code{TRIM()} to trim substrings. ANSI SQL only supports removal
  920. of single characters.
  921. @item
  922. The @code{GROUP BY} functions @code{STD()}, @code{BIT_OR()}, and
  923. @code{BIT_AND()}.
  924. @item
  925. Use of @code{REPLACE} instead of @code{DELETE} + @code{INSERT}.
  926. @xref{REPLACE, , @code{REPLACE}}.
  927. @item
  928. The @code{FLUSH flush_option} statement.
  929. @item
  930. The possiblity to set variables in a statement with @code{:=}:
  931. @example
  932. SELECT @@a:=SUM(total),@@b=COUNT(*),@@a/@@b AS avg FROM test_table;
  933. SELECT @@t1:=(@@t2:=1)+@@t3:=4,@@t1,@@t2,@@t3;
  934. @end example
  935. @end itemize
  936. @node ANSI mode, Differences from ANSI, Extensions to ANSI, Compatibility
  937. @section Running MySQL in ANSI Mode
  938. @cindex running, ANSI mode
  939. @cindex ANSI mode, running
  940. If you start mysqld with the @code{--ansi} option, the following behavior
  941. of @strong{MySQL} changes:
  942. @itemize @bullet
  943. @item
  944. @code{||} is string concatenation instead of @code{OR}.
  945. @item
  946. You can have any number of spaces between a function name and the @samp{(}.
  947. This forces all function names to be treated as reserved words.
  948. @item
  949. @samp{"} will be an identifier quote character (like the @strong{MySQL}
  950. @samp{`} quote character) and not a string quote character.
  951. @item
  952. @code{REAL} will be a synonym for @code{FLOAT} instead of a synonym of
  953. @code{DOUBLE}.
  954. @end itemize
  955. @node Differences from ANSI, Missing functions, ANSI mode, Compatibility
  956. @section MySQL Differences Compared to ANSI SQL92
  957. We try to make @strong{MySQL} follow the ANSI SQL standard and the
  958. ODBC SQL standard, but in some cases @strong{MySQL} does some things
  959. differently:
  960. @itemize @bullet
  961. @item
  962. @code{--} is only a comment if followed by a white space. @xref{Missing
  963. comments}.
  964. @item
  965. For @code{VARCHAR} columns, trailing spaces are removed when the value is
  966. stored. @xref{Bugs}.
  967. @item
  968. In some cases, @code{CHAR} columns are silently changed to @code{VARCHAR}
  969. columns. @xref{Silent column changes}.
  970. @item
  971. Privileges for a table are not automatically revoked when you delete a
  972. table. You must explicitly issue a @code{REVOKE} to revoke privileges for
  973. a table. @xref{GRANT, , @code{GRANT}}.
  974. @item
  975. @code{NULL AND FALSE} will evaluate to @code{NULL} and not to @code{FALSE}.
  976. This is because we don't think it's good to have to evaluate a lot of
  977. extra conditions in this case.
  978. @end itemize
  979. @node Missing functions, Standards, Differences from ANSI, Compatibility
  980. @section Functionality Missing from MySQL
  981. @cindex missing functionality
  982. @cindex functionality, missing
  983. The following functionality is missing in the current version of
  984. @strong{MySQL}.  For a prioritized list indicating when new extensions
  985. may be added to @strong{MySQL}, you should consult
  986. @uref{http://www.mysql.com/documentation/manual.php?section=TODO, the
  987. online @strong{MySQL} TODO list}. That is the latest version of the TODO
  988. list in this manual. @xref{TODO}.
  989. @menu
  990. * Missing Sub-selects::         Sub-selects
  991. * Missing SELECT INTO TABLE::   @code{SELECT INTO TABLE}
  992. * Missing Transactions::        Transactions
  993. * Missing Triggers::            Triggers
  994. * Missing Foreign Keys::        Foreign Keys
  995. * Missing Views::               Views
  996. * Missing comments::            @samp{--} as the start of a comment
  997. @end menu
  998. @node Missing Sub-selects, Missing SELECT INTO TABLE, Missing functions, Missing functions
  999. @subsection Sub-selects
  1000. @cindex sub-selects
  1001. The following will not yet work in @strong{MySQL}:
  1002. @example
  1003. SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
  1004. SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
  1005. SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.id);
  1006. @end example
  1007. However, in many cases you can rewrite the query without a sub-select:
  1008. @example
  1009. SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;
  1010. SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
  1011. @end example
  1012. For more complicated subqueries you can often create temporary tables
  1013. to hold the subquery.  In some cases, however this option will not
  1014. work. The most frequently encountered of these cases arises with
  1015. @code{DELETE} statements, for which standard SQL does not support joins
  1016. (except in sub-selects).  For this situation there are two options
  1017. available until subqueries are supported by @strong{MySQL}.
  1018. The first option is to use a procedural programming language (such as
  1019. Perl or PHP) to submit a @code{SELECT} query to obtain the primary keys
  1020. for the records to be deleted, and then use these values to construct
  1021. the @code{DELETE} statement (@code{DELETE FROM ... WHERE ... IN (key1,
  1022. key2, ...)}).
  1023. The second option is to use interactive SQL to contruct a set of
  1024. @code{DELETE} statements automatically, using the @strong{MySQL}
  1025. extension @code{CONCAT()} (in lieu of the standard @code{||} operator).
  1026. For example:
  1027. @example
  1028. SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
  1029.   FROM tab1, tab2
  1030.  WHERE tab1.col1 = tab2.col2;
  1031. @end example
  1032. You can place this query in a script file and redirect input from it to
  1033. the @code{mysql} command-line interpreter, piping its output back to a
  1034. second instance of the interpreter:
  1035. @example
  1036. prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb
  1037. @end example
  1038. @strong{MySQL} only supports @code{INSERT ... SELECT ...} and
  1039. @code{REPLACE ... SELECT ...} Independent sub-selects will probably
  1040. be available in Version 4.0.  You can now use the function @code{IN()} in
  1041. other contexts, however.
  1042. @node Missing SELECT INTO TABLE, Missing Transactions, Missing Sub-selects, Missing functions
  1043. @subsection @code{SELECT INTO TABLE}
  1044. @findex SELECT INTO TABLE
  1045. @strong{MySQL} doesn't yet support the Oracle SQL extension:
  1046. @code{SELECT ... INTO TABLE ...}.  @strong{MySQL} supports instead the
  1047. ANSI SQL syntax @code{INSERT INTO ... SELECT ...}, which is basically
  1048. the same thing. @xref{INSERT SELECT}.
  1049. @example
  1050. INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
  1051. tblTemp1.fldOrder_ID > 100;
  1052. @end example
  1053. Alternatively, you can use @code{SELECT INTO OUTFILE...} or @code{CREATE
  1054. TABLE ... SELECT} to solve your problem.
  1055. @node Missing Transactions, Missing Triggers, Missing SELECT INTO TABLE, Missing functions
  1056. @subsection Transactions
  1057. @cindex transactions, support
  1058. As @strong{MySQL} does nowadays support transactions, the following
  1059. discussion is only valid if you are only using the non-transaction-safe
  1060. table types. @xref{COMMIT}.
  1061. The question is often asked, by the curious and the critical, ``Why is
  1062. @strong{MySQL} not a transactional database?'' or ``Why does @strong{MySQL}
  1063. not support transactions?''
  1064. @strong{MySQL} has made a conscious decision to support another paradigm
  1065. for data integrity, ``atomic operations.'' It is our thinking and
  1066. experience that atomic operations offer equal or even better integrity
  1067. with much better performance. We, nonetheless, appreciate and understand
  1068. the transactional database paradigm and plan, within the next few releases,
  1069. to introduce transaction-safe tables on a per table basis. We will be
  1070. giving our users the possibility to decide if they need the speed of
  1071. atomic operations or if they need to use transactional features in their
  1072. applications.
  1073. How does one use the features of @strong{MySQL} to maintain rigorous integrity
  1074. and how do these features compare with the transactional paradigm?
  1075. First, in the transactional paradigm, if your applications are written
  1076. in a way that is dependent on the calling of ``rollback'' instead of
  1077. ``commit'' in critical situations, then transactions are more
  1078. convenient. Moreover, transactions ensure that unfinished updates or
  1079. corrupting activities are not committed to the database; the server is
  1080. given the opportunity to do an automatic rollback and your database is
  1081. saved.
  1082. @strong{MySQL}, in almost all cases, allows you to solve for potential
  1083. problems by including simple checks before updates and by running simple
  1084. scripts that check the databases for inconsistencies and automatically
  1085. repair or warn if such occurs. Note that just by using the
  1086. @strong{MySQL} log or even adding one extra log, one can normally fix
  1087. tables perfectly with no data integrity loss.
  1088. Moreover, fatal transactional updates can be rewritten to be
  1089. atomic. In fact,we will go so far as to say that all integrity problems
  1090. that transactions solve can be done with @code{LOCK TABLES} or atomic updates,
  1091. ensuring that you never will get an automatic abort from the database,
  1092. which is a common problem with transactional databases.
  1093. Not even transactions can prevent all loss if the server goes down.  In
  1094. such cases even a transactional system can lose data.  The difference
  1095. between different systems lies in just how small the time-lap is where
  1096. they could lose data. No system is 100% secure, only ``secure
  1097. enough.'' Even Oracle, reputed to be the safest of transactional
  1098. databases, is reported to sometimes lose data in such situations.
  1099. To be safe with @strong{MySQL}, you only need to have backups and have
  1100. the update logging turned on.  With this you can recover from any
  1101. situation that you could with any transactional database.  It is, of
  1102. course, always good to have backups, independent of which database you
  1103. use.
  1104. The transactional paradigm has its benefits and its drawbacks. Many
  1105. users and application developers depend on the ease with which they can
  1106. code around problems where an abort appears to be, or is necessary, and they
  1107. may have to do a little more work with @strong{MySQL} to either think
  1108. differently or write more. If you are new to the atomic operations
  1109. paradigm, or more familiar or more comfortable with transactions, do not
  1110. jump to the conclusion that @strong{MySQL} has not addressed these
  1111. issues. Reliability and integrity are foremost in our minds.  Recent
  1112. estimates indicate that there are more than 1,000,000 mysqld servers
  1113. currently running, many of which are in production environments.  We
  1114. hear very, very seldom from our users that they have lost any data, and
  1115. in almost all of those cases user error is involved. This is, in our
  1116. opinion, the best proof of @strong{MySQL}'s stability and reliability.
  1117. Lastly, in situations where integrity is of highest importance,
  1118. @strong{MySQL}'s current features allow for transaction-level or better
  1119. reliability and integrity. If you lock tables with @code{LOCK TABLES}, all
  1120. updates will stall until any integrity checks are made.  If you only obtain
  1121. a read lock (as opposed to a write lock), then reads and inserts are
  1122. still allowed to happen.  The new inserted records will not be seen by
  1123. any of the clients that have a @code{READ} lock until they release their read
  1124. locks.  With @code{INSERT DELAYED} you can queue inserts into a local queue,
  1125. until the locks are released, without having the client wait for the insert
  1126. to complete. @xref{INSERT DELAYED}.
  1127. ``Atomic,'' in the sense that we mean it, is nothing magical. It only means
  1128. that you can be sure that while each specific update is running, no other
  1129. user can interfere with it, and there will never be an automatic
  1130. rollback (which can happen on transaction based systems if you are not
  1131. very careful).  @strong{MySQL} also guarantees that there will not be
  1132. any dirty reads.  You can find some example of how to write atomic updates
  1133. in the commit-rollback section. @xref{Commit-rollback}.
  1134. We have thought quite a bit about integrity and performance, and we
  1135. believe that our atomic operations paradigm allows for both high
  1136. reliability and extremely high performance, on the order of three to
  1137. five times the speed of the fastest and most optimally tuned of
  1138. transactional databases. We didn't leave out transactions because they
  1139. are hard to do. The main reason we went with atomic operations as
  1140. opposed to transactions is that by doing this we could apply many speed
  1141. optimizations that would not otherwise have been possible.
  1142. Many of our users who have speed foremost in their minds are not at all
  1143. concerned about transactions. For them transactions are not an
  1144. issue. For those of our users who are concerned with or have wondered
  1145. about transactions vis-a-vis @strong{MySQL}, there is a ``@strong{MySQL}
  1146. way'' as we have outlined above.  For those where safety is more
  1147. important than speed, we recommend them to use the @code{BDB},
  1148. @code{GEMINI} or @code{INNOBASE} tables for all their critical
  1149. data. @xref{Table types}.
  1150. One final note: We are currently working on a safe replication schema
  1151. that we believe to be better than any commercial replication system we
  1152. know of. This system will work most reliably under the atomic
  1153. operations, non-transactional, paradigm. Stay tuned.
  1154. @node Missing Triggers, Missing Foreign Keys, Missing Transactions, Missing functions
  1155. @subsection Stored Procedures and Triggers
  1156. @cindex stored procedures and triggers, defined
  1157. @cindex procedures, stored
  1158. @cindex triggers, stored
  1159. A stored procedure is a set of SQL commands that can be compiled and stored
  1160. in the server. Once this has been done, clients don't need to keep reissuing
  1161. the entire query but can refer to the stored procedure. This provides better
  1162. performance because the query has to be parsed only once, and less information
  1163. needs to be sent between the server and the client. You can also raise the
  1164. conceptual level by having libraries of functions in the server.
  1165. A trigger is a stored procedure that is invoked when a particular event
  1166. occurs.  For example, you can install a stored procedure that is triggered
  1167. each time a record is deleted from a transaction table and that automatically
  1168. deletes the corresponding customer from a customer table when all his
  1169. transactions are deleted.
  1170. The planned update language will be able to
  1171. handle stored procedures, but without triggers. Triggers usually slow
  1172. down everything, even queries for which they are not needed.
  1173. To see when @strong{MySQL} might get stored procedures, see @ref{TODO}.
  1174. @node Missing Foreign Keys, Missing Views, Missing Triggers, Missing functions
  1175. @subsection Foreign Keys
  1176. @cindex foreign keys
  1177. @cindex keys, foreign
  1178. Note that foreign keys in SQL are not used to join tables, but are used
  1179. mostly for checking referential integrity (foreign key constraints).  If
  1180. you want to get results from multiple tables from a @code{SELECT}
  1181. statement, you do this by joining tables:
  1182. @example
  1183. SELECT * from table1,table2 where table1.id = table2.id;
  1184. @end example
  1185. @xref{JOIN, , @code{JOIN}}. @xref{example-Foreign keys}.
  1186. The @code{FOREIGN KEY} syntax in @strong{MySQL} exists only for compatibility
  1187. with other SQL vendors' @code{CREATE TABLE} commands; it doesn't do
  1188. anything.  The @code{FOREIGN KEY} syntax without @code{ON DELETE ...} is
  1189. mostly used for documentation purposes. Some ODBC applications may use this
  1190. to produce automatic @code{WHERE} clauses, but this is usually easy to
  1191. override. @code{FOREIGN KEY} is sometimes used as a constraint check, but
  1192. this check is unnecessary in practice if rows are inserted into the tables in
  1193. the right order. @strong{MySQL} only supports these clauses because some
  1194. applications require them to exist (regardless of whether or not they
  1195. work).
  1196. In @strong{MySQL}, you can work around the problem of @code{ON DELETE
  1197. ...} not being implemented by adding the appropriate @code{DELETE} statement to
  1198. an application when you delete records from a table that has a foreign key.
  1199. In practice this is as quick (in some cases quicker) and much more portable
  1200. than using foreign keys.
  1201. In the near future we will extend the @code{FOREIGN KEY} implementation so
  1202. that at least the information will be saved in the table specification file
  1203. and may be retrieved by @code{mysqldump} and ODBC. At a later stage we will
  1204. implement the foreign key constraints for application that can't easily be
  1205. coded to avoid them.
  1206. @menu
  1207. * Broken Foreign KEY::          Reasons NOT to use foreign keys constraints
  1208. @end menu
  1209. @node Broken Foreign KEY,  , Missing Foreign Keys, Missing Foreign Keys
  1210. @subsubsection Reasons NOT to Use Foreign Keys constraints
  1211. @cindex foreign keys, reasons not to use
  1212. There are so many problems with foreign key constraints that we don't
  1213. know where to start:
  1214. @itemize @bullet
  1215. @item
  1216. Foreign key constraints make life very complicated, because the foreign
  1217. key definitions must be stored in a database and implementing them would
  1218. destroy the whole ``nice approach'' of using files that can be moved,
  1219. copied, and removed.
  1220. @item
  1221. The speed impact is terrible for @code{INSERT} and @code{UPDATE}
  1222. statements, and in this case almost all @code{FOREIGN KEY} constraint
  1223. checks are useless because you usually insert records in the right
  1224. tables in the right order, anyway.
  1225. @item
  1226. There is also a need to hold locks on many more tables when updating one
  1227. table, because the side effects can cascade through the entire database. It's
  1228. MUCH faster to delete records from one table first and subsequently delete
  1229. them from the other tables.
  1230. @item
  1231. You can no longer restore a table by doing a full delete from the table
  1232. and then restoring all records (from a new source or from a backup).
  1233. @item
  1234. If you use foreign key constraints you can't dump and restore tables
  1235. unless you do so in a very specific order.
  1236. @item
  1237. It's very easy to do ``allowed'' circular definitions that make the
  1238. tables impossible to re-create each table with a single create statement,
  1239. even if the definition works and is usable.
  1240. @item
  1241. It's very easy to overlook @code{FOREIGN KEY ... ON DELETE} rules when
  1242. one codes an application. It's not unusual that one loses a lot of
  1243. important information just because a wrong or misused @code{ON DELETE} rule.
  1244. @end itemize
  1245. The only nice aspect of @code{FOREIGN KEY} is that it gives ODBC and some
  1246. other client programs the ability to see how a table is connected and to use
  1247. this to show connection diagrams and to help in building applicatons.
  1248. @strong{MySQL} will soon store @code{FOREIGN KEY} definitions so that a
  1249. client can ask for and receive an answer about how the original
  1250. connection was made. The current @file{.frm} file format does not have
  1251. any place for it.  At a later stage we will implement the foreign key
  1252. constraints for application that can't easily be coded to avoid them.
  1253. @node Missing Views, Missing comments, Missing Foreign Keys, Missing functions
  1254. @subsection Views
  1255. @cindex views
  1256. @strong{MySQL} doesn't yet support views, but we plan to implement these
  1257. to about 4.1.
  1258. Views are mostly useful in letting user access a set of relations as one
  1259. table (in read-only mode).  Many SQL databases doesn't allow one to update
  1260. any rows in a view, but you have to do the updates in the separate tables.
  1261. As @strong{MySQL} is mostly used in applications and on web system where
  1262. the application write has full control on the database usage, most of
  1263. our users haven't regarded views to be very important. (At least no one
  1264. has been interested enough of this to be prepared to finance the
  1265. implementation of views).
  1266. One doesn't need views in @strong{MySQL} to restrict access to columns
  1267. as @strong{MySQL} has a very sophisticated privilege
  1268. system. @xref{Privilege system}.
  1269. @node Missing comments,  , Missing Views, Missing functions
  1270. @subsection @samp{--} as the Start of a Comment
  1271. @cindex comments, starting
  1272. @cindex starting, comments
  1273. Some other SQL databases use @samp{--} to start comments. @strong{MySQL}
  1274. has @samp{#} as the start comment character, even if the @code{mysql}
  1275. command-line tool removes all lines that start with @samp{--}.
  1276. You can also use the C comment style @code{/* this is a comment */} with
  1277. @strong{MySQL}.
  1278. @xref{Comments}.
  1279. @strong{MySQL} Version 3.23.3 and above supports the @samp{--} comment style
  1280. only if the comment is followed by a space.  This is because this
  1281. degenerate comment style has caused many problems with automatically
  1282. generated SQL queries that have used something like the following code,
  1283. where we automatically insert the value of the payment for
  1284. @code{!payment!}:
  1285. @example
  1286. UPDATE tbl_name SET credit=credit-!payment!
  1287. @end example
  1288. What do you think will happen when the value of @code{payment} is negative?
  1289. Because @code{1--1} is legal in SQL, we think it is terrible that
  1290. @samp{--} means start comment.
  1291. In @strong{MySQL} Version 3.23 you can, however, use:
  1292. @code{1-- This is a comment}
  1293. The following discussion only concerns you if you are running a @strong{MySQL}
  1294. version earlier than Version 3.23:
  1295. If you have a SQL program in a text file that contains @samp{--} comments
  1296. you should use:
  1297. @example
  1298. shell> replace " --" " #" < text-file-with-funny-comments.sql 
  1299.          | mysql database
  1300. @end example
  1301. instead of the usual:
  1302. @example
  1303. shell> mysql database < text-file-with-funny-comments.sql
  1304. @end example
  1305. You can also edit the command file ``in place'' to change the @samp{--}
  1306. comments to @samp{#} comments:
  1307. @example
  1308. shell> replace " --" " #" -- text-file-with-funny-comments.sql
  1309. @end example
  1310. Change them back with this command:
  1311. @example
  1312. shell> replace " #" " --" -- text-file-with-funny-comments.sql
  1313. @end example
  1314. @node Standards, Commit-rollback, Missing functions, Compatibility
  1315. @section What Standards Does MySQL Follow?
  1316. Entry level SQL92. ODBC levels 0-2.
  1317. @node Commit-rollback,  , Standards, Compatibility
  1318. @section How to Cope Without @code{COMMIT}/@code{ROLLBACK}
  1319. @findex COMMIT
  1320. @findex ROLLBACK
  1321. @cindex transaction-safe tables
  1322. @cindex tables, updating
  1323. @cindex updating, tables
  1324. @cindex @code{BDB} tables
  1325. @cindex @code{GEMINI} tables
  1326. @cindex @code{INNOBASE} tables
  1327. The following mostly applies only for @code{ISAM}, @code{MyISAM}, and
  1328. @code{HEAP} tables. If you only use transaction-safe tables (@code{BDB},
  1329. @code{GEMINI} or @code{INNOBASE} tables) in an a update, you can do
  1330. @code{COMMIT} and @code{ROLLBACK} also with @strong{MySQL}.
  1331. @xref{COMMIT}.
  1332. The problem with handling @code{COMMIT}-@code{ROLLBACK} efficiently with
  1333. the above table types would require a completely different table layout
  1334. than @strong{MySQL} uses today.  The table type would also need extra
  1335. threads that do automatic cleanups on the tables, and the disk usage
  1336. would be much higher. This would make these table types about 2-4 times
  1337. slower than they are today.
  1338. For the moment, we prefer implementing the SQL server language (something
  1339. like stored procedures). With this you would very seldom really need
  1340. @code{COMMIT}-@code{ROLLBACK.} This would also give much better performance.
  1341. Loops that need transactions normally can be coded with the help of
  1342. @code{LOCK TABLES}, and you don't need cursors when you can update records
  1343. on the fly.
  1344. We at TcX had a greater need for a real fast database than a 100%
  1345. general database. Whenever we find a way to implement these features without
  1346. any speed loss, we will probably do it. For the moment, there are many more
  1347. important things to do. Check the TODO for how we prioritize things at
  1348. the moment. (Customers with higher levels of support can alter this, so
  1349. things may be reprioritized.)
  1350. The current problem is actually @code{ROLLBACK}. Without
  1351. @code{ROLLBACK}, you can do any kind of @code{COMMIT} action with
  1352. @code{LOCK TABLES}. To support @code{ROLLBACK} with the above table
  1353. types, @strong{MySQL} would have to be changed to store all old records
  1354. that were updated and revert everything back to the starting point if
  1355. @code{ROLLBACK} was issued. For simple cases, this isn't that hard to do
  1356. (the current @code{isamlog} could be used for this purpose), but it
  1357. would be much more difficult to implement @code{ROLLBACK} for
  1358. @code{ALTER/DROP/CREATE TABLE}.
  1359. To avoid using @code{ROLLBACK}, you can use the following strategy:
  1360. @enumerate
  1361. @item
  1362. Use @code{LOCK TABLES ...} to lock all the tables you want to access.
  1363. @item
  1364. Test conditions.
  1365. @item
  1366. Update if everything is okay.
  1367. @item
  1368. Use @code{UNLOCK TABLES} to release your locks.
  1369. @end enumerate
  1370. This is usually a much faster method than using transactions with possible
  1371. @code{ROLLBACK}s, although not always. The only situation this solution
  1372. doesn't handle is when someone kills the threads in the middle of an
  1373. update. In this case, all locks will be released but some of the updates may
  1374. not have been executed.
  1375. You can also use functions to update records in a single operation.
  1376. You can get a very efficient application by using the following techniques:
  1377. @itemize @bullet
  1378. @item Modify fields relative to their current value.
  1379. @item Update only those fields that actually have changed.
  1380. @end itemize
  1381. For example, when we are doing updates to some customer information, we
  1382. update only the customer data that has changed and test only that none of
  1383. the changed data, or data that depend on the changed data, has changed
  1384. compared to the original row. The test for changed data is done with the
  1385. @code{WHERE} clause in the @code{UPDATE} statement. If the record wasn't
  1386. updated, we give the client a message: "Some of the data you have changed
  1387. have been changed by another user". Then we show the old row versus the new
  1388. row in a window, so the user can decide which version of the customer record
  1389. he should use.
  1390. This gives us something that is similar to column locking but is actually
  1391. even better, because we only update some of the columns, using values that
  1392. are relative to their current values.  This means that typical @code{UPDATE}
  1393. statements look something like these:
  1394. @example
  1395. UPDATE tablename SET pay_back=pay_back+'relative change';
  1396. UPDATE customer
  1397.   SET
  1398.     customer_date='current_date',
  1399.     address='new address',
  1400.     phone='new phone',
  1401.     money_he_owes_us=money_he_owes_us+'new_money'
  1402.   WHERE
  1403.     customer_id=id AND address='old address' AND phone='old phone';
  1404. @end example
  1405. As you can see, this is very efficient and works even if another client has
  1406. changed the values in the @code{pay_back} or @code{money_he_owes_us} columns.
  1407. @findex mysql_insert_id()
  1408. @findex LAST_INSERT_ID()
  1409. In many cases, users have wanted @code{ROLLBACK} and/or @code{LOCK
  1410. TABLES} for the purpose of managing unique identifiers for some tables. This
  1411. can be handled much more efficiently by using an @code{AUTO_INCREMENT} column
  1412. and either the SQL function @code{LAST_INSERT_ID()} or the C API function
  1413. @code{mysql_insert_id()}. @xref{mysql_insert_id, , @code{mysql_insert_id()}}.
  1414. @cindex rows, locking
  1415. At MySQL AB, we have never had any need for row-level locking because we have
  1416. always been able to code around it. Some cases really need row
  1417. locking, but they are very few. If you want row-level locking, you
  1418. can use a flag column in the table and do something like this:
  1419. @example
  1420. UPDATE tbl_name SET row_flag=1 WHERE id=ID;
  1421. @end example
  1422. @strong{MySQL} returns 1 for the number of affected rows if the row was
  1423. found and @code{row_flag} wasn't already 1 in the original row.
  1424. You can think of it as @strong{MySQL} changed the above query to:
  1425. @example
  1426. UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1;
  1427. @end example
  1428. @node Privilege system, Reference, Compatibility, Top
  1429. @chapter The MySQL Access Privilege System
  1430. @cindex system, security
  1431. @cindex access privileges
  1432. @cindex privleges, access
  1433. @cindex security system
  1434. @cindex ACLs
  1435. @strong{MySQL} has an advanced but non-standard security/privilege
  1436. system.  This section describes how it works.
  1437. @menu
  1438. * General security::            General security
  1439. * Security::                    How to make @strong{MySQL} secure against crackers
  1440. * Privileges options::          
  1441. * What Privileges::             What the privilege system does
  1442. * User names::                  @strong{MySQL} user names and passwords
  1443. * Connecting::                  Connecting to the @strong{MySQL} server
  1444. * Password security::           Keeping your password secure
  1445. * Privileges provided::         Privileges provided by @strong{MySQL}
  1446. * Privileges::                  How the privilege system works
  1447. * Connection access::           Access control, stage 1: Connection verification
  1448. * Request access::              Access control, stage 2: Request verification
  1449. * Privilege changes::           When privilege changes take effect
  1450. * Default privileges::          Setting up the initial @strong{MySQL} privileges
  1451. * Adding users::                Adding new user privileges to @strong{MySQL}
  1452. * Passwords::                   How to set up passwords
  1453. * Access denied::               Causes of @code{Access denied} errors
  1454. @end menu
  1455. @node General security, Security, Privilege system, Privilege system
  1456. @section General Security
  1457. Anyone using @strong{MySQL} on a computer connected to the Internet
  1458. should read this section to avoid the most common security mistakes.
  1459. In discussing security, we emphasize the necessity of fully protecting the
  1460. entire server host (not simply the @strong{MySQL} server) against all types
  1461. of applicable attacks: eavesdropping, altering, playback, and denial of
  1462. service. We do not cover all aspects of availability and fault tolerance
  1463. here.
  1464. @strong{MySQL} uses Access Control Lists (ACLs) security for all
  1465. connections, queries, and other operations that a user may attempt to
  1466. perform. There is also some support for SSL-encrypted connections
  1467. between @strong{MySQL} clients and servers. Many of the concepts
  1468. discussed here are not specific to @strong{MySQL} at all; the same
  1469. general ideas apply to almost all applications.
  1470. When running @strong{MySQL}, follow these guidelines whenever possible:
  1471. @itemize @bullet
  1472. @item
  1473. DON'T EVER GIVE ANYONE (EXCEPT THE @strong{MySQL} ROOT USER) ACCESS TO THE
  1474. mysql.user TABLE!  The encrypted password is the real password in
  1475. @strong{MySQL}. If you know this for one user you can easily login as
  1476. him if you have access to his 'host'.
  1477. @item
  1478. Learn the @strong{MySQL} access privilege system. The @code{GRANT} and
  1479. @code{REVOKE} commands are used for restricting access to @strong{MySQL}. Do
  1480. not grant any more privileges than necessary. Never grant privileges to all
  1481. hosts.
  1482. Checklist:
  1483. @itemize @minus
  1484. @item
  1485. Try @code{mysql -u root}. If you are able to connect successfully to the
  1486. server without being asked for a password, you have problems. Any user (not
  1487. just root) can connect to your @strong{MySQL} server with full privileges!
  1488. Review the @strong{MySQL} installation instructions, paying particular
  1489. attention to the item about setting a @code{root} password.
  1490. @item
  1491. Use the command @code{SHOW GRANTS} and check to see who has access to
  1492. what. Remove those privileges that are not necessary using the @code{REVOKE}
  1493. command.
  1494. @end itemize
  1495. @item
  1496. Do not keep any plain-text passwords in your database. When your
  1497. computer becomes compromised, the intruder can take the full list of
  1498. passwords and use them. Instead use @code{MD5()} or another one-way
  1499. hashing function.
  1500. @item
  1501. Do not use passwords from dictionaries. There are special programs to
  1502. break them. Even passwords like ``xfish98'' are very bad.  Much better is
  1503. ``duag98'' which contains the same word ``fish'' but typed one key to the
  1504. left on a standard QWERTY keyboard. Another method is to use ``Mhall'' which
  1505. is taken from the first characters of of each word in the sentence ``Mary had
  1506. a little lamb.'' This is easy to remember and type, but hard to guess for
  1507. someone who does not know it.
  1508. @item
  1509. Invest in a firewall. This protects from at least 50% of all types of
  1510. exploits in any software. Put @strong{MySQL} behind the firewall or in
  1511. a demilitarized zone (DMZ).
  1512. Checklist:
  1513. @itemize @minus
  1514. @item
  1515. Try to scan your ports from the Internet using a tool such as
  1516. @code{nmap}. @strong{MySQL} uses port 3306 by default. This port should
  1517. be inaccessible from untrusted hosts. Another simple way to check whether or
  1518. not your @strong{MySQL} port is open is to type @code{telnet
  1519. server_host 3306} from some remote machine, where
  1520. @code{server_host} is the hostname of your @strong{MySQL}
  1521. server. If you get a connection and some garbage characters, the port is
  1522. open, and should be closed on your firewall or router, unless you really
  1523. have a good reason to keep it open. If @code{telnet} just hangs,
  1524. everything is OK, the port is blocked.
  1525. @end itemize
  1526. @item
  1527. Do not trust any data entered by your users. They can try to trick your
  1528. code by entering special or escaped character sequences in Web forms,
  1529. URLs, or whatever application you have built. Be sure that your
  1530. application remains secure if a user enters something like ``@code{; DROP
  1531. DATABASE mysql;}''. This is an extreme example, but large security leaks
  1532. and data loss may occur as a result of hackers using similar techniques,
  1533. if you do not prepare for them.
  1534. Also remember to check numeric data. A common mistake is to protect only
  1535. strings. Sometimes people think that if a database contains only publicly
  1536. available data that it need not be protected. This is incorrect. At least
  1537. denial-of-service type attacks can be performed on such
  1538. databases. The simplest way to protect from this type of attack is to use
  1539. apostrophes around the numeric constants: @code{SELECT * FROM table
  1540. WHERE ID='234'} instead of @code{SELECT * FROM table WHERE ID=234}.
  1541. @strong{MySQL} automatically converts this string to a number and
  1542. strips all non-numeric symbols from it.
  1543. Checklist:
  1544. @itemize @minus
  1545. @item
  1546. All WWW applications:
  1547. @itemize @bullet
  1548. @item
  1549. Try to enter @samp{'} and @samp{"} in all your Web forms. If you get any kind
  1550. of @strong{MySQL} error, investigate the problem right away.
  1551. @item
  1552. Try to modify any dynamic URLs by adding @code{%22} (@samp{"}), @code{%23}
  1553. (@samp{#}), and @code{%27} (@samp{'}) in the URL.
  1554. @item
  1555. Try to modify datatypes in dynamic URLs from numeric ones to character
  1556. ones containing characters from previous examples. Your application
  1557. should be safe against this and similar attacks.
  1558. @item
  1559. Try to enter characters, spaces, and special symbols instead of numbers in
  1560. numeric fields. Your application should remove them before passing them to
  1561. @strong{MySQL} or your application should generate an error. Passing
  1562. unchecked values to @strong{MySQL} is very dangerous!
  1563. @item
  1564. Check data sizes before passing them to @strong{MySQL}.
  1565. @item
  1566. Consider having your application connect to the database using a
  1567. different user name than the one you use for administrative purposes. Do
  1568. not give your applications any more access privileges than they need.
  1569. @end itemize
  1570. @item
  1571. Users of PHP:
  1572. @itemize @bullet
  1573. @item Check out the @code{addslashes()} function.
  1574. @end itemize
  1575. @item
  1576. Users of @strong{MySQL} C API:
  1577. @itemize @bullet
  1578. @item Check out the @code{mysql_escape()} API call.
  1579. @end itemize
  1580. @item
  1581. Users of @strong{MySQL}++:
  1582. @itemize @bullet
  1583. @item Check out the @code{escape} and @code{quote} modifiers for query streams.
  1584. @end itemize
  1585. @item
  1586. Users of Perl DBI:
  1587. @itemize @bullet
  1588. @item Check out the @code{quote()} method.
  1589. @end itemize
  1590. @end itemize
  1591. @item
  1592. Do not transmit plain (unencrypted) data over the Internet. These data are
  1593. accessible to everyone who has the time and ability to intercept it and use
  1594. it for their own purposes. Instead, use an encrypted protocol such as SSL or
  1595. SSH. @strong{MySQL} supports internal SSL connections as of Version 3.23.9.
  1596. SSH port-forwarding can be used to create an encrypted (and compressed)
  1597. tunnel for the communication.
  1598. @item
  1599. Learn to use the @code{tcpdump} and @code{strings} utilities. For most cases,
  1600. you can check whether or not @strong{MySQL} data streams are unencrypted
  1601. by issuing a command like the following:
  1602. @example
  1603. shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
  1604. @end example
  1605. (This works under Linux and should work with small modifications under
  1606. other systems).  Warning: If you do not see data this doesn't always
  1607. actually mean that it is encrypted. If you need high security, you should
  1608. consult with a security expert.
  1609. @end itemize
  1610. @node Security, Privileges options, General security, Privilege system
  1611. @section How to Make MySQL Secure Against Crackers
  1612. @cindex crackers, security against
  1613. @cindex security, against crackers
  1614. When you connect to a @strong{MySQL} server, you normally should use a
  1615. password.  The password is not transmitted in clear text over the
  1616. connection, however the encryption algorithm is not very strong, and
  1617. with some effort a clever attacker can crack the password if he is able
  1618. to sniff the traffic between the client and the server. If the
  1619. connection between the client and the server goes through an untrusted
  1620. network, you should use an @strong{SSH} tunnel to encrypt the
  1621. communication.
  1622. All other information is transferred as text that can be read by anyone
  1623. who is able to watch the connection.  If you are concerned about this,
  1624. you can use the compressed protocol (in @strong{MySQL} Version 3.22 and above)
  1625. to make things much harder.  To make things even more secure you should
  1626. use @code{ssh} (see @uref{http://www.cs.hut.fi/ssh}).  With this, you
  1627. can get an encrypted TCP/IP connection between a @strong{MySQL} server
  1628. and a @strong{MySQL} client.
  1629. To make a @strong{MySQL} system secure, you should strongly consider the
  1630. following suggestions:
  1631. @itemize @bullet
  1632. @item
  1633. Use passwords for all @strong{MySQL} users. Remember that anyone can log in
  1634. as any other person as simply as @code{mysql -u other_user db_name} if
  1635. @code{other_user} has no password.  It is common behavior with client/server
  1636. applications that the client may specify any user name.  You can change the
  1637. password of all users by editing the @code{mysql_install_db} script before
  1638. you run it, or only the password for the @strong{MySQL} @code{root} user like
  1639. this:
  1640. @example
  1641. shell> mysql -u root mysql
  1642. mysql> UPDATE user SET Password=PASSWORD('new_password')
  1643.            WHERE user='root';
  1644. mysql> FLUSH PRIVILEGES;
  1645. @end example
  1646. @item
  1647. Don't run the @strong{MySQL} daemon as the Unix @code{root} user.
  1648. It is very dangerous as any user with @code{FILE} privileges will be able to
  1649. create files
  1650. as @code{root} (for example, @code{~root/.bashrc}). To prevent this
  1651. @code{mysqld} will refuse to run as @code{root} unless it is specified
  1652. directly via @code{--user=root} option.
  1653. @code{mysqld} can be run as any user instead.  You can also create a new
  1654. Unix user @code{mysql} to make everything even more secure.  If you run
  1655. @code{mysqld} as another Unix user, you don't need to change the
  1656. @code{root} user name in the @code{user} table, because @strong{MySQL}
  1657. user names have nothing to do with Unix user names.  You can edit the
  1658. @code{mysql.server} script to start @code{mysqld} as another Unix user.
  1659. Normally this is done with the @code{su} command.  For more details, see
  1660. @ref{Changing MySQL user, , Changing @strong{MySQL} user}.
  1661. @item
  1662. If you put a password for the Unix @code{root} user in the @code{mysql.server}
  1663. script, make sure this script is readable only by @code{root}.
  1664. @item
  1665. Check that the Unix user that @code{mysqld} runs as is the only user with
  1666. read/write privileges in the database directories.
  1667. @item
  1668. On Unix platforms, do not run @code{mysqld} as root unless you really
  1669. need to. Consider creating a user named @code{mysql} for that purpose.
  1670. @item
  1671. Don't give the @strong{process} privilege to all users.  The output of
  1672. @code{mysqladmin processlist} shows the text of the currently executing
  1673. queries, so any user who is allowed to execute that command might be able to
  1674. see if another user issues an @code{UPDATE user SET
  1675. password=PASSWORD('not_secure')} query.
  1676. @code{mysqld} reserves an extra connection for users who have the
  1677. @strong{process} privilege, so that a @strong{MySQL} @code{root} user can log
  1678. in and check things even if all normal connections are in use.
  1679. @item
  1680. Don't give the @strong{file} privilege to all users.  Any user that has this
  1681. privilege can write a file anywhere in the file system with the privileges of
  1682. the @code{mysqld} daemon!  To make this a bit safer, all files generated with
  1683. @code{SELECT ... INTO OUTFILE} are readable to everyone, and you can't
  1684. overwrite existing files.
  1685. @tindex /etc/passwd
  1686. The @strong{file} privilege may also be used to read any file accessible
  1687. to the Unix user that the server runs as.  This could be abused, for example,
  1688. by using @code{LOAD DATA} to load @file{/etc/passwd} into a table, which
  1689. can then be read with @code{SELECT}.
  1690. @item
  1691. If you don't trust your DNS, you should use IP numbers instead of hostnames
  1692. in the grant tables.  In principle, the @code{--secure} option to
  1693. @code{mysqld} should make hostnames safe.  In any case, you should be very
  1694. careful about creating grant table entries using hostname values that
  1695. contain wild cards!
  1696. @item
  1697. If you want to restrict the number of connections for a single user, you
  1698. can do this by setting the @code{max_user_connections} variable in
  1699. @code{mysqld}.
  1700. @end itemize
  1701. @node Privileges options, What Privileges, Security, Privilege system
  1702. @section Startup options to mysqld which concerns security
  1703. The following @code{mysqld} options affect networking security:
  1704. @table @code
  1705. @item --secure
  1706. IP numbers returned by the @code{gethostbyname()} system call are
  1707. checked to make sure they resolve back to the original hostname. This
  1708. makes it harder for someone on the outside to get access by pretending
  1709. to be another host.  This option also adds some sanity checks of
  1710. hostnames.  The option is turned off by default in @strong{MySQL} Version
  1711. 3.21 because sometimes it takes a long time to perform backward resolutions.
  1712. @strong{MySQL} Version 3.22 caches hostnames and has this option enabled by
  1713. default.
  1714. @item --skip-grant-tables
  1715. This option causes the server not to use the privilege system at all. This
  1716. gives everyone @emph{full access} to all databases!  (You can tell a running
  1717. server to start using the grant tables again by executing @code{mysqladmin
  1718. flush-privileges} or @code{mysqladmin reload}.)
  1719. @item --skip-name-resolve
  1720. Hostnames are not resolved.  All @code{Host} column values in the grant
  1721. tables must be IP numbers or @code{localhost}.
  1722. @item --skip-networking
  1723. Don't allow TCP/IP connections over the network.  All connections to
  1724. @code{mysqld} must be made via Unix sockets. This option is unsuitable for
  1725. systems that use MIT-pthreads, because the MIT-pthreads package doesn't
  1726. support Unix sockets.
  1727. @item --skip-show-database
  1728. @code{SHOW DATABASE} command doesn't return anything.
  1729. @item --safe-show-database
  1730. @code{SHOW DATABASE} only returns databases for which the user have
  1731. some kind of privilege.
  1732. @end table
  1733. @node What Privileges, User names, Privileges options, Privilege system
  1734. @section What the Privilege System Does
  1735. @cindex system, privilege
  1736. @cindex privilege system
  1737. @cindex passwords, security
  1738. The primary function of the @strong{MySQL} privilege system is to
  1739. authenticate a user connecting from a given host, and to associate that user
  1740. with privileges on a database such as
  1741. @strong{select}, @strong{insert}, @strong{update} and @strong{delete}.
  1742. Additional functionality includes the ability to have an anonymous user and
  1743. to grant privileges for @strong{MySQL}-specific functions such as @code{LOAD
  1744. DATA INFILE} and administrative operations.
  1745. @node User names, Connecting, What Privileges, Privilege system
  1746. @section MySQL User Names and Passwords
  1747. @cindex user names, and passwords
  1748. @cindex passwords, for users
  1749. There are several distinctions between the way user names and passwords are
  1750. used by @strong{MySQL} and the way they are used by Unix or Windows:
  1751. @itemize @bullet
  1752. @item
  1753. User names, as used by @strong{MySQL} for authentication purposes, have
  1754. nothing to do with Unix user names (login names) or Windows user names.  Most
  1755. @strong{MySQL} clients by default try to log in using the current Unix user
  1756. name as the @strong{MySQL} user name, but that is for convenience only.
  1757. Client programs allow a different name to be specified with the @code{-u} or
  1758. @code{--user} options. This means that you can't make a database secure in
  1759. any way unless all @strong{MySQL} user names have passwords.  Anyone may
  1760. attempt to connect to the server using any name, and they will succeed if
  1761. they specify any name that doesn't have a password.
  1762. @item
  1763. @strong{MySQL} user names can be up to 16 characters long; Unix user names
  1764. typically are limited to 8 characters.
  1765. @item
  1766. @strong{MySQL} passwords have nothing to do with Unix passwords.  There is no
  1767. necessary connection between the password you use to log in to a Unix machine
  1768. and the password you use to access a database on that machine.
  1769. @item
  1770. @strong{MySQL} encrypts passwords using a different algorithm than the
  1771. one used during the Unix login process.  See the descriptions of the
  1772. @code{PASSWORD()} and @code{ENCRYPT()} functions in @ref{Miscellaneous
  1773. functions}.  Note that even if the password is stored 'scrambled', and
  1774. knowing your 'scrambled' password is enough to be able to connect to
  1775. the @strong{MySQL} server!
  1776. @end itemize
  1777. @node Connecting, Password security, User names, Privilege system
  1778. @section Connecting to the MySQL Server
  1779. @cindex connecting, to the server
  1780. @cindex default hostname
  1781. @cindex hostname, default
  1782. @cindex server, connecting
  1783. @strong{MySQL} client programs generally require that you specify connection
  1784. parameters when you want to access a @strong{MySQL} server: the host you want
  1785. to connect to, your user name, and your password.  For example, the
  1786. @code{mysql} client can be started like this (optional arguments are enclosed
  1787. between @samp{[} and @samp{]}):
  1788. @example
  1789. shell> mysql [-h host_name] [-u user_name] [-pyour_pass]
  1790. @end example
  1791. Alternate forms of the @code{-h}, @code{-u}, and @code{-p} options are
  1792. @code{--host=host_name}, @code{--user=user_name}, and
  1793. @code{--password=your_pass}.  Note that there is @emph{no space} between
  1794. @code{-p} or @code{--password=} and the password following it.
  1795. @strong{NOTE:} Specifying a password on the command line is not secure!
  1796. Any user on your system may then find out your password by typing a command
  1797. like: @code{ps auxww}.  @xref{Option files}.
  1798. @code{mysql} uses default values for connection parameters that are missing
  1799. from the command line:
  1800. @itemize @bullet
  1801. @item
  1802. The default hostname is @code{localhost}.
  1803. @item
  1804. The default user name is your Unix login name.
  1805. @item
  1806. No password is supplied if @code{-p} is missing.
  1807. @end itemize
  1808. Thus, for a Unix user @code{joe}, the following commands are equivalent:
  1809. @example
  1810. shell> mysql -h localhost -u joe
  1811. shell> mysql -h localhost
  1812. shell> mysql -u joe
  1813. shell> mysql
  1814. @end example
  1815. Other @strong{MySQL} clients behave similarly.
  1816. On Unix systems, you can specify different default values to be used when you
  1817. make a connection, so that you need not enter them on the command line each
  1818. time you invoke a client program.  This can be done in a couple of ways:
  1819. @itemize @bullet
  1820. @item
  1821. @tindex .my.cnf file
  1822. You can specify connection parameters in the @code{[client]} section of the
  1823. @file{.my.cnf} configuration file in your home directory.  The relevant
  1824. section of the file might look like this:
  1825. @example
  1826. [client]
  1827. host=host_name
  1828. user=user_name
  1829. password=your_pass
  1830. @end example
  1831. @xref{Option files}.
  1832. @item
  1833. @tindex MYSQL_HOST environment variable
  1834. @tindex Environment variable, MYSQL_HOST
  1835. @tindex MYSQL_PWD environment variable
  1836. @tindex Environment variable, MYSQL_PWD
  1837. @tindex USER environment variable
  1838. @tindex Environment variable, USER
  1839. You can specify connection parameters using environment variables.  The
  1840. host can be specified for @code{mysql} using @code{MYSQL_HOST}.  The
  1841. @strong{MySQL} user name can be specified using @code{USER} (this is for
  1842. Windows only).  The password can be specified using @code{MYSQL_PWD}
  1843. (but this is insecure; see the next section).  @xref{Environment variables}.
  1844. @end itemize
  1845. @node Password security, Privileges provided, Connecting, Privilege system
  1846. @section Keeping Your Password Secure
  1847. It is inadvisable to specify your password in a way that exposes it to
  1848. discovery by other users.  The methods you can use to specify your password
  1849. when you run client programs are listed below, along with an assessment of
  1850. the risks of each method:
  1851. @itemize @bullet
  1852. @item
  1853. Never give a normal user access to the @code{mysql.user} table. Knowing
  1854. the encrypted password for a user makes it possible to login as this
  1855. user.  The passwords are only scrambled so that one shouldn't be able to
  1856. see the real password you used (if you happen to use a similar password
  1857. with your other applications).
  1858. @item
  1859. Use a @code{-pyour_pass} or @code{--password=your_pass} option on the command
  1860. line.  This is convenient but insecure, because your password becomes visible
  1861. to system status programs (such as @code{ps}) that may be invoked by other
  1862. users to display command lines.  (@strong{MySQL} clients typically overwrite
  1863. the command-line argument with zeroes during their initialization sequence,
  1864. but there is still a brief interval during which the value is visible.)
  1865. @item
  1866. Use a @code{-p} or @code{--password} option (with no @code{your_pass} value
  1867. specified).  In this case, the client program solicits the password from
  1868. the terminal:
  1869. @findex -p option
  1870. @findex -password option
  1871. @example
  1872. shell> mysql -u user_name -p
  1873. Enter password: ********
  1874. @end example
  1875. The @samp{*} characters represent your password.
  1876. It is more secure to enter your password this way than to specify it on the
  1877. command line because it is not visible to other users.  However, this method
  1878. of entering a password is suitable only for programs that you run
  1879. interactively.  If you want to invoke a client from a script that runs
  1880. non-interactively, there is no opportunity to enter the password from the
  1881. terminal. On some systems, you may even find that the first line of your
  1882. script is read and interpreted (incorrectly) as your password!
  1883. @item
  1884. @tindex .my.cnf file
  1885. Store your password in a configuration file.  For example, you can list your
  1886. password in the @code{[client]} section of the @file{.my.cnf} file in your
  1887. home directory:
  1888. @example
  1889. [client]
  1890. password=your_pass
  1891. @end example
  1892. If you store your password in @file{.my.cnf}, the file should not be group or
  1893. world readable or writable.  Make sure the file's access mode is @code{400}
  1894. or @code{600}.
  1895. @xref{Option files}.
  1896. @item
  1897. You can store your password in the @code{MYSQL_PWD} environment variable, but
  1898. this method must be considered extremely insecure and should not be used.
  1899. Some versions of @code{ps} include an option to display the environment of
  1900. running processes; your password will be in plain sight for all to see if
  1901. you set @code{MYSQL_PWD}.  Even on systems without such a version of
  1902. @code{ps}, it is unwise to assume there is no other method to observe process
  1903. environments. @xref{Environment variables}.
  1904. @end itemize
  1905. All in all, the safest methods are to have the client program prompt for the
  1906. password or to specify the password in a properly protected @file{.my.cnf}
  1907. file.
  1908. @node Privileges provided, Privileges, Password security, Privilege system
  1909. @section Privileges Provided by MySQL
  1910. @cindex privilege information, location
  1911. Information about user privileges is stored in the @code{user}, @code{db},
  1912. @code{host}, @code{tables_priv}, and @code{columns_priv} tables in the
  1913. @code{mysql} database (that is, in the database named @code{mysql}).  The
  1914. @strong{MySQL} server reads the contents of these tables when it starts up
  1915. and under the circumstances indicated in @ref{Privilege changes}.
  1916. The names used in this manual to refer to the privileges provided by
  1917. @strong{MySQL} are shown below, along with the table column name associated
  1918. with each privilege in the grant tables and the context in which the
  1919. privilege applies:
  1920. @multitable @columnfractions .15 .25 .6
  1921. @item @strong{Privilege}   @tab @strong{Column}      @tab @strong{Context}
  1922. @item @strong{select}      @tab @code{Select_priv}   @tab tables
  1923. @item @strong{insert}      @tab @code{Insert_priv}   @tab tables
  1924. @item @strong{update}      @tab @code{Update_priv}   @tab tables
  1925. @item @strong{delete}      @tab @code{Delete_priv}   @tab tables
  1926. @item @strong{index}       @tab @code{Index_priv}    @tab tables
  1927. @item @strong{alter}       @tab @code{Alter_priv}    @tab tables
  1928. @item @strong{create}      @tab @code{Create_priv}   @tab databases, tables, or indexes
  1929. @item @strong{drop}        @tab @code{Drop_priv}     @tab databases or tables
  1930. @item @strong{grant}       @tab @code{Grant_priv}    @tab databases or tables
  1931. @item @strong{references}  @tab @code{References_priv} @tab databases or tables
  1932. @item @strong{reload}      @tab @code{Reload_priv}   @tab server administration
  1933. @item @strong{shutdown}    @tab @code{Shutdown_priv} @tab server administration
  1934. @item @strong{process}     @tab @code{Process_priv}  @tab server administration
  1935. @item @strong{file}        @tab @code{File_priv}     @tab file access on server
  1936. @end multitable
  1937. The @strong{select}, @strong{insert}, @strong{update}, and @strong{delete}
  1938. privileges allow you to perform operations on rows in existing tables in
  1939. a database.
  1940. @code{SELECT} statements require the @strong{select} privilege only if they
  1941. actually retrieve rows from a table.  You can execute certain @code{SELECT}
  1942. statements even without permission to access any of the databases on the
  1943. server.  For example, you could use the @code{mysql} client as a simple
  1944. calculator:
  1945. @example
  1946. mysql> SELECT 1+1;
  1947. mysql> SELECT PI()*2;
  1948. @end example
  1949. The @strong{index} privilege allows you to create or drop (remove) indexes.
  1950. The @strong{alter} privilege allows you to use @code{ALTER TABLE}.
  1951. The @strong{create} and @strong{drop} privileges allow you to create new
  1952. databases and tables, or to drop (remove) existing databases and tables.
  1953. Note that if you grant the @strong{drop} privilege for the @code{mysql}
  1954. database to a user, that user can drop the database in which the
  1955. @strong{MySQL} access privileges are stored!
  1956. The @strong{grant} privilege allows you to give to other users those
  1957. privileges you yourself possess.
  1958. The @strong{file} privilege gives you permission to read and write files on
  1959. the server using the @code{LOAD DATA INFILE} and @code{SELECT ... INTO
  1960. OUTFILE} statements.  Any user to whom this privilege is granted can read or
  1961. write any file that the @strong{MySQL} server can read or write.
  1962. The remaining privileges are used for administrative operations, which are
  1963. performed using the @code{mysqladmin} program.  The table below shows which
  1964. @code{mysqladmin} commands each administrative privilege allows you to
  1965. execute:
  1966. @multitable @columnfractions .15 .85
  1967. @item @strong{Privilege}  @tab @strong{Commands permitted to privilege holders}
  1968. @item @strong{reload}     @tab @code{reload}, @code{refresh},
  1969. @code{flush-privileges}, @code{flush-hosts}, @code{flush-logs}, and
  1970. @code{flush-tables}
  1971. @item @strong{shutdown}   @tab @code{shutdown}
  1972. @item @strong{process}    @tab @code{processlist}, @code{kill}
  1973. @end multitable
  1974. The @code{reload} command tells the server to re-read the grant tables.  The
  1975. @code{refresh} command flushes all tables and opens and closes the log
  1976. files.  @code{flush-privileges} is a synonym for @code{reload}.  The other
  1977. @code{flush-*} commands perform functions similar to @code{refresh} but are
  1978. more limited in scope, and may be preferable in some instances.  For example,
  1979. if you want to flush just the log files, @code{flush-logs} is a better choice
  1980. than @code{refresh}.
  1981. The @code{shutdown} command shuts down the server.
  1982. The @code{processlist} command displays information about the threads
  1983. executing within the server.  The @code{kill} command kills server threads.
  1984. You can always display or kill your own threads, but you need the
  1985. @strong{process} privilege to display or kill threads initiated by other
  1986. users. @xref{KILL}.
  1987. It is a good idea in general to grant privileges only to those users who need
  1988. them, but you should exercise particular caution in granting certain
  1989. privileges:
  1990. @itemize @bullet
  1991. @item
  1992. The @strong{grant} privilege allows users to give away their privileges to
  1993. other users.  Two users with different privileges and with the @strong{grant}
  1994. privilege are able to combine privileges.
  1995. @item
  1996. The @strong{alter} privilege may be used to subvert the privilege system
  1997. by renaming tables.
  1998. @item
  1999. The @strong{file} privilege can be abused to read any world-readable file on
  2000. the server into a database table, the contents of which can then be
  2001. accessed using @code{SELECT}. This includes the contents of all databases
  2002. hosted by the server!
  2003. @item
  2004. The @strong{shutdown} privilege can be abused to deny service to other
  2005. users entirely, by terminating the server.
  2006. @item
  2007. The @strong{process} privilege can be used to view the plain text of
  2008. currently executing queries, including queries that set or change passwords.
  2009. @item
  2010. Privileges on the @code{mysql} database can be used to change passwords
  2011. and other access privilege information.  (Passwords are stored
  2012. encrypted, so a malicious user cannot simply read them to know the plain
  2013. text password).  If they can access the @code{mysql.user} password
  2014. column, they can use it to log into the @strong{MySQL} server
  2015. for the given user.  (With sufficient privileges, the same user can
  2016. replace a password with a different one.)
  2017. @end itemize
  2018. There are some things that you cannot do with the @strong{MySQL}
  2019. privilege system:
  2020. @itemize @bullet
  2021. @item
  2022. You cannot explicitly specify that a given user should be denied access.
  2023. That is, you cannot explicitly match a user and then refuse the connection.
  2024. @item
  2025. You cannot specify that a user has privileges to create or drop tables
  2026. in a database but not to create or drop the database itself.
  2027. @end itemize
  2028. @node Privileges, Connection access, Privileges provided, Privilege system
  2029. @section How the Privilege System Works
  2030. @cindex privilege system, described
  2031. The @strong{MySQL} privilege system ensures that all users may do exactly the
  2032. things that they are supposed to be allowed to do.  When you connect to a
  2033. @strong{MySQL} server, your identity is determined by @strong{the host from
  2034. which you connect} and @strong{the user name you specify}.  The system grants
  2035. privileges according to your identity and @strong{what you want to do}.
  2036. @strong{MySQL} considers both your hostname and user name in identifying you
  2037. because there is little reason to assume that a given user name belongs to
  2038. the same person everywhere on the Internet.  For example, the user
  2039. @code{bill} who connects from @code{whitehouse.gov} need not be the same
  2040. person as the user @code{bill} who connects from @code{microsoft.com}.
  2041. @strong{MySQL} handles this by allowing you to distinguish users on different
  2042. hosts that happen to have the same name:  you can grant @code{bill} one set
  2043. of privileges for connections from @code{whitehouse.gov}, and a different set
  2044. of privileges for connections from @code{microsoft.com}.
  2045. @strong{MySQL} access control involves two stages:
  2046. @itemize @bullet
  2047. @item
  2048. Stage 1: The server checks whether or not you are even allowed to connect.
  2049. @item
  2050. Stage 2: Assuming you can connect, the server checks each request you issue
  2051. to see whether or not you have sufficient privileges to perform it.  For
  2052. example, if you try to select rows from a table in a database or drop a table
  2053. from the database, the server makes sure you have the @strong{select}
  2054. privilege for the table or the @strong{drop} privilege for the database.
  2055. @end itemize
  2056. The server uses the @code{user}, @code{db}, and @code{host} tables in the
  2057. @code{mysql} database at both stages of access control.  The fields in these
  2058. grant tables are shown below:
  2059. @multitable @columnfractions .2 .25 .25 .25
  2060. @item @strong{Table name} @tab @code{user} @tab @code{db} @tab @code{host}
  2061. @item @strong{Scope fields} @tab @code{Host}          @tab @code{Host}        @tab @code{Host}
  2062. @item @tab @code{User}          @tab @code{Db}          @tab @code{Db}
  2063. @item @tab @code{Password}      @tab @code{User}        @tab
  2064. @item @strong{Privilege fields} @tab @code{Select_priv} @tab @code{Select_priv} @tab @code{Select_priv}
  2065. @item @tab @code{Insert_priv}   @tab @code{Insert_priv} @tab @code{Insert_priv}
  2066. @item @tab @code{Update_priv}   @tab @code{Update_priv} @tab @code{Update_priv}
  2067. @item @tab @code{Delete_priv}   @tab @code{Delete_priv} @tab @code{Delete_priv}
  2068. @item @tab @code{Index_priv}    @tab @code{Index_priv}  @tab @code{Index_priv}
  2069. @item @tab @code{Alter_priv}    @tab @code{Alter_priv}  @tab @code{Alter_priv}
  2070. @item @tab @code{Create_priv}   @tab @code{Create_priv} @tab @code{Create_priv}
  2071. @item @tab @code{Drop_priv}     @tab @code{Drop_priv}   @tab @code{Drop_priv}
  2072. @item @tab @code{Grant_priv}    @tab @code{Grant_priv}  @tab @code{Grant_priv}
  2073. @item @tab @code{References_priv} @tab                  @tab
  2074. @item @tab @code{Reload_priv}   @tab                    @tab
  2075. @item @tab @code{Shutdown_priv} @tab                    @tab
  2076. @item @tab @code{Process_priv}  @tab                    @tab
  2077. @item @tab @code{File_priv}     @tab                    @tab
  2078. @end multitable
  2079. For the second stage of access control (request verification), the server
  2080. may, if the request involves tables, additionally consult the
  2081. @code{tables_priv} and @code{columns_priv} tables.  The fields in these
  2082. tables are shown below:
  2083. @multitable @columnfractions .2 .25 .25
  2084. @item @strong{Table name}   @tab @code{tables_priv} @tab @code{columns_priv}
  2085. @item @strong{Scope fields} @tab @code{Host}        @tab @code{Host}
  2086. @item                       @tab @code{Db}          @tab @code{Db}
  2087. @item                       @tab @code{User}        @tab @code{User}
  2088. @item                       @tab @code{Table_name}  @tab @code{Table_name}
  2089. @item                       @tab                    @tab @code{Column_name}
  2090. @item @strong{Privilege fields} @tab @code{Table_priv}   @tab @code{Column_priv}
  2091. @item                           @tab @code{Column_priv}  @tab
  2092. @item @strong{Other fields} @tab @code{Timestamp}   @tab @code{Timestamp}
  2093. @item                       @tab @code{Grantor}     @tab
  2094. @end multitable
  2095. Each grant table contains scope fields and privilege fields.
  2096. Scope fields determine the scope of each entry in the tables, that is, the
  2097. context in which the entry applies.  For example, a @code{user} table entry
  2098. with @code{Host} and @code{User} values of @code{'thomas.loc.gov'} and
  2099. @code{'bob'} would be used for authenticating connections made to the server
  2100. by @code{bob} from the host @code{thomas.loc.gov}.  Similarly, a @code{db}
  2101. table entry with @code{Host}, @code{User}, and @code{Db} fields of
  2102. @code{'thomas.loc.gov'}, @code{'bob'} and @code{'reports'} would be used when
  2103. @code{bob} connects from the host @code{thomas.loc.gov} to access the
  2104. @code{reports} database.  The @code{tables_priv} and @code{columns_priv}
  2105. tables contain scope fields indicating tables or table/column combinations
  2106. to which each entry applies.
  2107. @cindex case sensitivity, in access checking
  2108. For access-checking purposes, comparisons of @code{Host} values are
  2109. case insensitive.  @code{User}, @code{Password}, @code{Db}, and
  2110. @code{Table_name} values are case sensitive.
  2111. @code{Column_name} values are case insensitive in @strong{MySQL} Version
  2112. 3.22.12 or later.
  2113. Privilege fields indicate the privileges granted by a table entry, that is,
  2114. what operations can be performed.  The server combines the information in the
  2115. various grant tables to form a complete description of a user's privileges.
  2116. The rules used to do this are described in @ref{Request access}.
  2117. Scope fields are strings, declared as shown below; the default value for
  2118. each is the empty string:
  2119. @multitable @columnfractions .15 .15 .7
  2120. @item @strong{Field name} @tab @strong{Type}
  2121. @item @code{Host}         @tab @code{CHAR(60)}
  2122. @item @code{User}         @tab @code{CHAR(16)}
  2123. @item @code{Password}     @tab @code{CHAR(16)}
  2124. @item @code{Db}           @tab @code{CHAR(64)} @tab (@code{CHAR(60)} for the
  2125. @code{tables_priv} and @code{columns_priv} tables)
  2126. @item @code{Table_name}   @tab @code{CHAR(60)}
  2127. @item @code{Column_name}  @tab @code{CHAR(60)}
  2128. @end multitable
  2129. In the @code{user}, @code{db} and @code{host} tables,
  2130. all privilege fields are declared as @code{ENUM('N','Y')} --- each can have a
  2131. value of @code{'N'} or @code{'Y'}, and the default value is @code{'N'}.
  2132. In the @code{tables_priv} and @code{columns_priv} tables, the privilege
  2133. fields are declared as @code{SET} fields:
  2134. @multitable @columnfractions .2 .2 .6
  2135. @item @strong{Table name} @tab @strong{Field name} @tab @strong{Possible set elements}
  2136. @item @code{tables_priv} @tab @code{Table_priv} @tab @code{'Select', 'Insert',
  2137. 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'}
  2138. @item @code{tables_priv} @tab @code{Column_priv} @tab @code{'Select', 'Insert',
  2139. 'Update', 'References'}
  2140. @item @code{columns_priv} @tab @code{Column_priv} @tab @code{'Select', 'Insert',
  2141. 'Update', 'References'}
  2142. @end multitable
  2143. Briefly, the server uses the grant tables like this:
  2144. @itemize @bullet
  2145. @item
  2146. The @code{user} table scope fields determine whether to allow or reject
  2147. incoming connections.  For allowed connections, any privileges granted in
  2148. the @code{user} table indicate the user's global (superuser) privileges.
  2149. These privileges apply to @strong{all} databases on the server.
  2150. @item
  2151. The @code{db} and @code{host} tables are used together:
  2152. @itemize @minus
  2153. @item
  2154. The @code{db} table scope fields determine which users can access which
  2155. databases from which hosts.  The privilege fields determine which operations
  2156. are allowed.
  2157. @item
  2158. The @code{host} table is used as an extension of the @code{db} table when you
  2159. want a given @code{db} table entry to apply to several hosts.  For example,
  2160. if you want a user to be able to use a database from several hosts in
  2161. your network, leave the @code{Host} value empty in the user's @code{db} table
  2162. entry, then populate the @code{host} table with an entry for each of those
  2163. hosts.  This mechanism is described more detail in @ref{Request access}.
  2164. @end itemize
  2165. @item
  2166. The @code{tables_priv} and @code{columns_priv} tables are similar to
  2167. the @code{db} table, but are more fine-grained: they apply at the
  2168. table and column levels rather than at the database level.
  2169. @end itemize
  2170. Note that administrative privileges (@strong{reload}, @strong{shutdown},
  2171. etc.) are specified only in the @code{user} table.  This is because
  2172. administrative operations are operations on the server itself and are not
  2173. database-specific, so there is no reason to list such privileges in the
  2174. other grant tables.  In fact, only the @code{user} table need
  2175. be consulted to determine whether or not you can perform an administrative
  2176. operation.
  2177. The @strong{file} privilege is specified only in the @code{user} table, too.
  2178. It is not an administrative privilege as such, but your ability to read or
  2179. write files on the server host is independent of the database you are
  2180. accessing.
  2181. The @code{mysqld} server reads the contents of the grant tables once, when it
  2182. starts up.  Changes to the grant tables take effect as indicated in
  2183. @ref{Privilege changes}.
  2184. When you modify the contents of the grant tables, it is a good idea to make
  2185. sure that your changes set up privileges the way you want.  For help in
  2186. diagnosing problems, see @ref{Access denied}.  For advice on security issues,
  2187. @pxref{Security}.
  2188. A useful
  2189. diagnostic tool is the @code{mysqlaccess} script, which Yves Carlier has
  2190. provided for the @strong{MySQL} distribution.  Invoke @code{mysqlaccess} with
  2191. the @code{--help} option to find out how it works.
  2192. Note that @code{mysqlaccess} checks access using only the @code{user},
  2193. @code{db} and @code{host} tables.  It does not check table- or column-level
  2194. privileges.
  2195. @node Connection access, Request access, Privileges, Privilege system
  2196. @section Access Control, Stage 1: Connection Verification
  2197. @cindex access control
  2198. @cindex control access
  2199. @cindex connecting, verification
  2200. @cindex testing, connection to the server
  2201. When you attempt to connect to a @strong{MySQL} server, the server accepts or
  2202. rejects the connection based on your identity and whether or not you can
  2203. verify your identity by supplying the correct password.  If not, the server
  2204. denies access to you completely.  Otherwise, the server accepts the
  2205. connection, then enters Stage 2 and waits for requests.
  2206. Your identity is based on two pieces of information:
  2207. @itemize @bullet
  2208. @item
  2209. The host from which you connect
  2210. @item
  2211. Your @strong{MySQL} user name
  2212. @end itemize
  2213. Identity checking is performed using the three @code{user} table scope fields
  2214. (@code{Host}, @code{User}, and @code{Password}).  The server accepts the
  2215. connection only if a @code{user} table entry matches your hostname and user
  2216. name, and you supply the correct password.
  2217. Values in the @code{user} table scope fields may be specified as follows:
  2218. @itemize @bullet
  2219. @item
  2220. A @code{Host} value may be a hostname or an IP number, or @code{'localhost'}
  2221. to indicate the local host.
  2222. @item
  2223. @cindex wildcards, in @code{mysql.user} table
  2224. You can use the wild-card characters @samp{%} and @samp{_} in the @code{Host}
  2225. field.
  2226. @item
  2227. A @code{Host} value of @code{'%'} matches any hostname.  A blank @code{Host}
  2228. value is equivalent to @code{'%'}.  Note that these values match @emph{any
  2229. host that can create a connection to your server!}
  2230. @cindex netmask notation, in @code{mysql.user} table
  2231. @item
  2232. As of MySQL Version 3.23, for @code{Host} values specified as IP numbers, you
  2233. can specify a netmask indicating how many address bits to use for the
  2234. network number. For example:
  2235. @example
  2236. GRANT ALL PRIVILEGES on db.* to david@@'192.58.197.0/255.255.255.0';
  2237. @end example
  2238. This will allow everyone to connect from an IP where the following is true:
  2239. @example
  2240. user_ip & netmask = host_ip.
  2241. @end example
  2242. In the above example all IP:s in the interval 192.58.197.0 -
  2243. 192.58.197.255 can connect to the @strong{MySQL} server.
  2244. @item
  2245. @cindex anonymous user
  2246. Wild-card characters are not allowed in the @code{User} field, but you can
  2247. specify a blank value, which matches any name.  If the @code{user} table
  2248. entry that matches an incoming connection has a blank user name, the user is
  2249. considered to be the anonymous user (the user with no name), rather than the
  2250. name that the client actually specified.  This means that a blank user name
  2251. is used for all further access checking for the duration of the connection
  2252. (that is, during Stage 2).
  2253. @item
  2254. The @code{Password} field can be blank.  This does not mean that any password
  2255. matches, it means the user must connect without specifying a password.
  2256. @end itemize
  2257. @findex PASSWORD()
  2258. Non-blank @code{Password} values represent encrypted passwords.
  2259. @strong{MySQL} does not store passwords in plaintext form for anyone to
  2260. see.  Rather, the password supplied by a user who is attempting to
  2261. connect is encrypted (using the @code{PASSWORD()} function). The
  2262. encrypted password is then used when the client/server is checking if
  2263. the password is correct (This is done without the encrypted password
  2264. ever traveling over the connection.)  Note that from @strong{MySQL}'s
  2265. point of view the encrypted password is the REAL password, so you should
  2266. not give anyone access to it!  In particular, don't give normal users
  2267. read access to the tables in the @code{mysql} database!
  2268. The examples below show how various combinations of @code{Host} and
  2269. @code{User} values in @code{user} table entries apply to incoming
  2270. connections:
  2271. @multitable @columnfractions .25 .15 .60
  2272. @item @code{Host} @strong{value} @tab @code{User} @strong{value} @tab @strong{Connections matched by entry}
  2273. @item @code{'thomas.loc.gov'} @tab @code{'fred'} @tab @code{fred}, connecting from @code{thomas.loc.gov}
  2274. @item @code{'thomas.loc.gov'} @tab @code{''} @tab Any user, connecting from @code{thomas.loc.gov}
  2275. @item  @code{'%'} @tab @code{'fred'} @tab @code{fred}, connecting from any host
  2276. @item @code{'%'} @tab  @code{''} @tab Any user, connecting from any host
  2277. @item @code{'%.loc.gov'} @tab @code{'fred'} @tab @code{fred}, connecting from any host in the @code{loc.gov} domain
  2278. @item @code{'x.y.%'} @tab @code{'fred'} @tab @code{fred}, connecting from @code{x.y.net}, @code{x.y.com},@code{x.y.edu}, etc. (this is probably not useful)
  2279. @item @code{'144.155.166.177'} @tab @code{'fred'} @tab @code{fred}, connecting from the host with IP address @code{144.155.166.177}
  2280. @item @code{'144.155.166.%'} @tab @code{'fred'} @tab @code{fred}, connecting from any host in the @code{144.155.166} class C subnet
  2281. @item @code{'144.155.166.0/255.255.255.0'} @tab @code{'fred'} @tab Same as previous example
  2282. @end multitable
  2283. Because you can use IP wild-card values in the @code{Host} field (for example,
  2284. @code{'144.155.166.%'} to match every host on a subnet), there is the
  2285. possibility that someone might try to exploit this capability by naming a
  2286. host @code{144.155.166.somewhere.com}.  To foil such attempts, @strong{MySQL}
  2287. disallows matching on hostnames that start with digits and a dot. Thus, if
  2288. you have a host named something like @code{1.2.foo.com}, its name will never
  2289. match the @code{Host} column of the grant tables.  Only an IP number can
  2290. match an IP wild-card value.
  2291. An incoming connection may be matched by more than one entry in the
  2292. @code{user} table.  For example, a connection from @code{thomas.loc.gov} by
  2293. @code{fred} would be matched by several of the entries just shown above.  How
  2294. does the server choose which entry to use if more than one matches?  The
  2295. server resolves this question by sorting the @code{user} table after reading
  2296. it at startup time, then looking through the entries in sorted order when a
  2297. user attempts to connect.  The first matching entry is the one that is used.
  2298. @code{user} table sorting works as follows.  Suppose the @code{user} table
  2299. looks like this:
  2300. @example
  2301. +-----------+----------+-
  2302. | Host      | User     | ...
  2303. +-----------+----------+-
  2304. | %         | root     | ...
  2305. | %         | jeffrey  | ...
  2306. | localhost | root     | ...
  2307. | localhost |          | ...
  2308. +-----------+----------+-
  2309. @end example
  2310. When the server reads in the table, it orders the entries with the
  2311. most-specific @code{Host} values first (@code{'%'} in the @code{Host} column
  2312. means ``any host'' and is least specific).  Entries with the same @code{Host}
  2313. value are ordered with the most-specific @code{User} values first (a blank
  2314. @code{User} value means ``any user'' and is least specific).  The resulting
  2315. sorted @code{user} table looks like this:
  2316. @example
  2317. +-----------+----------+-
  2318. | Host      | User     | ...
  2319. +-----------+----------+-
  2320. | localhost | root     | ...
  2321. | localhost |          | ...
  2322. | %         | jeffrey  | ...
  2323. | %         | root     | ...
  2324. +-----------+----------+-
  2325. @end example
  2326. @cindex grant tables, sorting
  2327. @cindex sorting, grant tables
  2328. @cindex @code{user} table, sorting
  2329. When a connection is attempted, the server looks through the sorted entries
  2330. and uses the first match found.  For a connection from @code{localhost} by
  2331. @code{jeffrey}, the entries with @code{'localhost'} in the @code{Host} column
  2332. match first.  Of those, the entry with the blank user name matches both the
  2333. connecting hostname and user name.  (The @code{'%'/'jeffrey'} entry would
  2334. have matched, too, but it is not the first match in the table.)
  2335. Here is another example.  Suppose the @code{user} table looks like this:
  2336. @example
  2337. +----------------+----------+-
  2338. | Host           | User     | ...
  2339. +----------------+----------+-
  2340. | %              | jeffrey  | ...
  2341. | thomas.loc.gov |          | ...
  2342. +----------------+----------+-
  2343. @end example
  2344. The sorted table looks like this:
  2345. @example
  2346. +----------------+----------+-
  2347. | Host           | User     | ...
  2348. +----------------+----------+-
  2349. | thomas.loc.gov |          | ...
  2350. | %              | jeffrey  | ...
  2351. +----------------+----------+-
  2352. @end example
  2353. A connection from @code{thomas.loc.gov} by @code{jeffrey} is matched by the
  2354. first entry, whereas a connection from @code{whitehouse.gov} by
  2355. @code{jeffrey} is matched by the second.
  2356. A common misconception is to think that for a given user name, all entries
  2357. that explicitly name that user will be used first when the server attempts to
  2358. find a match for the connection.  This is simply not true.  The previous
  2359. example illustrates this, where a connection from @code{thomas.loc.gov} by
  2360. @code{jeffrey} is first matched not by the entry containing @code{'jeffrey'}
  2361. as the @code{User} field value, but by the entry with no user name!
  2362. If you have problems connecting to the server, print out the @code{user}
  2363. table and sort it by hand to see where the first match is being made.
  2364. @node Request access, Privilege changes, Connection access, Privilege system
  2365. @section Access Control, Stage 2: Request Verification
  2366. Once you establish a connection, the server enters Stage 2.  For each request
  2367. that comes in on the connection, the server checks whether you have
  2368. sufficient privileges to perform it, based on the type of operation you wish
  2369. to perform.  This is where the privilege fields in the grant tables come into
  2370. play.  These privileges can come from any of the @code{user}, @code{db},
  2371. @code{host}, @code{tables_priv}, or @code{columns_priv} tables.  The grant
  2372. tables are manipulated with @code{GRANT} and @code{REVOKE} commands.
  2373. @xref{GRANT, , @code{GRANT}}.  (You may find it helpful to refer to
  2374. @ref{Privileges}, which lists the fields present in each of the grant
  2375. tables.)
  2376. The @code{user} table grants privileges that are assigned to you on a global
  2377. basis and that apply no matter what the current database is.  For example, if
  2378. the @code{user} table grants you the @strong{delete} privilege, you can
  2379. delete rows from any database on the server host!  In other words,
  2380. @code{user} table privileges are superuser privileges.  It is wise to grant
  2381. privileges in the @code{user} table only to superusers such as server or
  2382. database administrators.  For other users, you should leave the privileges
  2383. in the @code{user} table set to @code{'N'} and grant privileges on a
  2384. database-specific basis only, using the @code{db} and @code{host} tables.
  2385. @cindex Anonymous user
  2386. @cindex wild cards, in @code{mysql.db} table
  2387. @cindex wild cards, in @code{mysql.host} table
  2388. The @code{db} and @code{host} tables grant database-specific privileges.
  2389. Values in the scope fields may be specified as follows:
  2390. @itemize @bullet
  2391. @item
  2392. The wild-card characters @samp{%} and @samp{_} can be used in the @code{Host}
  2393. and @code{Db} fields of either table.
  2394. @item
  2395. A @code{'%'} @code{Host} value in the @code{db} table means ``any host.'' A
  2396. blank @code{Host} value in the @code{db} table means ``consult the
  2397. @code{host} table for further information.''
  2398. @item
  2399. A @code{'%'} or blank @code{Host} value in the @code{host} table means ``any
  2400. host.''
  2401. @item
  2402. A @code{'%'} or blank @code{Db} value in either table means ``any database.''
  2403. @item
  2404. A blank @code{User} value in either table matches the anonymous user.
  2405. @end itemize
  2406. @cindex grant tables, sorting
  2407. @cindex sorting, grant tables
  2408. @cindex @code{db} table, sorting
  2409. @cindex @code{host} table, sorting
  2410. The @code{db} and @code{host} tables are read in and sorted when the server
  2411. starts up (at the same time that it reads the @code{user} table).  The
  2412. @code{db} table is sorted on the @code{Host}, @code{Db}, and @code{User} scope
  2413. fields, and the @code{host} table is sorted on the @code{Host} and @code{Db}
  2414. scope fields.  As with the @code{user} table, sorting puts the most-specific
  2415. values first and least-specific values last, and when the server looks for
  2416. matching entries, it uses the first match that it finds.
  2417. @cindex wild cards, in @code{mysql.tables_priv} table
  2418. @cindex wild cards, in @code{mysql.columns_priv} table
  2419. The @code{tables_priv} and @code{columns_priv} tables grant table- and
  2420. column-specific privileges.  Values in the scope fields may be specified as
  2421. follows:
  2422. @itemize @bullet
  2423. @item
  2424. The wild-card characters @samp{%} and @samp{_}
  2425. can be used in the @code{Host} field of either table.
  2426. @item
  2427. A @code{'%'} or blank @code{Host} value in either table means ``any host.''
  2428. @item
  2429. The @code{Db}, @code{Table_name} and @code{Column_name} fields cannot contain
  2430. wild cards or be blank in either table.
  2431. @end itemize
  2432. The @code{tables_priv} and @code{columns_priv} tables are sorted on
  2433. the @code{Host}, @code{Db}, and @code{User} fields.  This is similar to
  2434. @code{db} table sorting, although the sorting is simpler because
  2435. only the @code{Host} field may contain wild cards.
  2436. The request verification process is described below.  (If you are familiar
  2437. with the access-checking source code, you will notice that the description
  2438. here differs slightly from the algorithm used in the code.  The description
  2439. is equivalent to what the code actually does; it differs only to make the
  2440. explanation simpler.)
  2441. For administrative requests (@strong{shutdown}, @strong{reload}, etc.), the
  2442. server checks only the @code{user} table entry, because that is the only table
  2443. that specifies administrative privileges.  Access is granted if the entry
  2444. allows the requested operation and denied otherwise.  For example, if you
  2445. want to execute @code{mysqladmin shutdown} but your @code{user} table entry
  2446. doesn't grant the @strong{shutdown} privilege to you, access is denied
  2447. without even checking the @code{db} or @code{host} tables.  (They
  2448. contain no @code{Shutdown_priv} column, so there is no need to do so.)
  2449. For database-related requests (@strong{insert}, @strong{update}, etc.), the
  2450. server first checks the user's global (superuser) privileges by looking in
  2451. the @code{user} table entry.  If the entry allows the requested operation,
  2452. access is granted.  If the global privileges in the @code{user} table are
  2453. insufficient, the server determines the user's database-specific privileges
  2454. by checking the @code{db} and @code{host} tables:
  2455. @enumerate
  2456. @item
  2457. The server looks in the @code{db} table for a match on the @code{Host},
  2458. @code{Db}, and @code{User} fields.  The @code{Host} and @code{User} fields are
  2459. matched to the connecting user's hostname and @strong{MySQL} user name.  The
  2460. @code{Db} field is matched to the database the user wants to access.  If
  2461. there is no entry for the @code{Host} and @code{User}, access is denied.
  2462. @item
  2463. If there is a matching @code{db} table entry and its @code{Host} field is
  2464. not blank, that entry defines the user's database-specific privileges.
  2465. @item
  2466. If the matching @code{db} table entry's @code{Host} field is blank, it
  2467. signifies that the @code{host} table enumerates which hosts should be allowed
  2468. access to the database.  In this case, a further lookup is done in the
  2469. @code{host} table to find a match on the @code{Host} and @code{Db} fields.
  2470. If no @code{host} table entry matches, access is denied.  If there is a
  2471. match, the user's database-specific privileges are computed as the
  2472. intersection (@emph{not} the union!) of the privileges in the @code{db} and
  2473. @code{host} table entries, that is, the privileges that are @code{'Y'} in both
  2474. entries.  (This way you can grant general privileges in the @code{db} table
  2475. entry and then selectively restrict them on a host-by-host basis using the
  2476. @code{host} table entries.)
  2477. @end enumerate
  2478. After determining the database-specific privileges granted by the @code{db}
  2479. and @code{host} table entries, the server adds them to the global privileges
  2480. granted by the @code{user} table.  If the result allows the requested
  2481. operation, access is granted.  Otherwise, the server checks the user's
  2482. table and column privileges in the @code{tables_priv} and @code{columns_priv}
  2483. tables and adds those to the user's privileges.  Access is allowed or denied
  2484. based on the result.
  2485. Expressed in boolean terms, the preceding description of how a user's
  2486. privileges are calculated may be summarized like this:
  2487. @example
  2488. global privileges
  2489. OR (database privileges AND host privileges)
  2490. OR table privileges
  2491. OR column privileges
  2492. @end example
  2493. It may not be apparent why, if the global @code{user} entry privileges are
  2494. initially found to be insufficient for the requested operation, the server
  2495. adds those privileges to the database-, table-, and column-specific privileges
  2496. later. The reason is that a request might require more than one type of
  2497. privilege.  For example, if you execute an @code{INSERT ...  SELECT}
  2498. statement, you need both @strong{insert} and @strong{select} privileges.
  2499. Your privileges might be such that the @code{user} table entry grants one
  2500. privilege and the @code{db} table entry grants the other.  In this case, you
  2501. have the necessary privileges to perform the request, but the server cannot
  2502. tell that from either table by itself; the privileges granted by the entries
  2503. in both tables must be combined.
  2504. @cindex @code{host} table
  2505. @cindex tables, @code{host}
  2506. The @code{host} table can be used to maintain a list of secure servers.
  2507. At TcX, the @code{host} table contains a list of all machines on the local
  2508. network. These are granted all privileges.
  2509. You can also use the @code{host} table to indicate hosts that are @emph{not}
  2510. secure.  Suppose you have a machine @code{public.your.domain} that is located
  2511. in a public area that you do not consider secure.  You can allow access to
  2512. all hosts on your network except that machine by using @code{host} table
  2513. entries
  2514. like this:
  2515. @example
  2516. +--------------------+----+-
  2517. | Host               | Db | ...
  2518. +--------------------+----+-
  2519. | public.your.domain | %  | ... (all privileges set to 'N')
  2520. | %.your.domain      | %  | ... (all privileges set to 'Y')
  2521. +--------------------+----+-
  2522. @end example
  2523. @cindex privilege, changes
  2524. @cindex changes to privileges
  2525. @cindex tables, grant
  2526. @cindex grant tables
  2527. Naturally, you should always test your entries in the grant tables (for
  2528. example, using @code{mysqlaccess}) to make sure your access privileges are
  2529. actually set up the way you think they are.
  2530. @node Privilege changes, Default privileges, Request access, Privilege system
  2531. @section When Privilege Changes Take Effect
  2532. When @code{mysqld} starts, all grant table contents are read into memory and
  2533. become effective at that point.
  2534. Modifications to the grant tables that you perform using @code{GRANT},
  2535. @code{REVOKE}, or @code{SET PASSWORD} are noticed by the server immediately.
  2536. If you modify the grant tables manually (using @code{INSERT}, @code{UPDATE},
  2537. etc.), you should execute a @code{FLUSH PRIVILEGES} statement or run
  2538. @code{mysqladmin flush-privileges} or @code{mysqladmin reload} to tell the
  2539. server to reload the grant tables.  Otherwise your changes will have @emph{no
  2540. effect} until you restart the server. If you change the grant tables manually
  2541. but forget to reload the privileges, you will be wondering why your changes
  2542. don't seem to make any difference!
  2543. When the server notices that the grant tables have been changed,
  2544. existing client connections are affected as follows:
  2545. @itemize @bullet
  2546. @item
  2547. Table and column privilege changes take effect with the client's next
  2548. request.
  2549. @item
  2550. Database privilege changes take effect at the next @code{USE db_name}
  2551. command.
  2552. @end itemize
  2553. Global privilege changes and password changes take effect the next time the
  2554. client connects.
  2555. @cindex privileges, default
  2556. @cindex default, privileges
  2557. @cindex root password
  2558. @cindex superuser
  2559. @cindex users, root
  2560. @cindex anonymous user
  2561. @cindex password, root user
  2562. @node Default privileges, Adding users, Privilege changes, Privilege system
  2563. @section Setting Up the Initial MySQL Privileges
  2564. After installing @strong{MySQL}, you set up the initial access privileges by
  2565. running @code{scripts/mysql_install_db}.
  2566. @xref{Quick install}.
  2567. The @code{mysql_install_db} script starts up the @code{mysqld}
  2568. server, then initializes the grant tables to contain the following set
  2569. of privileges:
  2570. @itemize @bullet
  2571. @item
  2572. The @strong{MySQL} @code{root} user is created as a superuser who can do
  2573. anything.  Connections must be made from the local host.
  2574. @strong{NOTE:}
  2575. The initial @code{root} password is empty, so anyone can connect as @code{root}
  2576. @emph{without a password} and be granted all privileges.
  2577. @item
  2578. @cindex anonymous user
  2579. An anonymous user is created that can do anything with databases that have a
  2580. name of @code{'test'} or starting with @code{'test_'}.  Connections must be
  2581. made from the local host.  This means any local user can connect without a
  2582. password and be treated as the anonymous user.
  2583. @item
  2584. Other privileges are denied.  For example, normal users can't use
  2585. @code{mysqladmin shutdown} or @code{mysqladmin processlist}.
  2586. @end itemize
  2587. @strong{NOTE:} The default privileges are different for Windows.
  2588. @xref{Windows running}.
  2589. Because your installation is initially wide open, one of the first things you
  2590. should do is specify a password for the @strong{MySQL}
  2591. @code{root} user.  You can do this as follows (note that you specify the
  2592. password using the @code{PASSWORD()} function):
  2593. @example
  2594. shell> mysql -u root mysql
  2595. mysql> UPDATE user SET Password=PASSWORD('new_password')
  2596.            WHERE user='root';
  2597. mysql> FLUSH PRIVILEGES;
  2598. @end example
  2599. You can, in @strong{MySQL} Version 3.22 and above, use the @code{SET PASSWORD}
  2600. statement:
  2601. @example
  2602. shell> mysql -u root mysql
  2603. mysql> SET PASSWORD FOR root=PASSWORD('new_password');
  2604. @end example
  2605. Another way to set the password is by using the @code{mysqladmin} command:
  2606. @example
  2607. shell> mysqladmin -u root password new_password
  2608. @end example
  2609. Only users with write/update access to the mysql database can change the
  2610. password for others users.  All normal users (not anonymous ones) can only
  2611. change their own password with either of the above commands or with
  2612. @code{SET PASSWORD=PASSWORD('new password')}.