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

MySQL数据库

开发平台:

Visual C++

  1. several date-part extraction functions, such as `YEAR()', `MONTH()', and
  2. `DAYOFMONTH()'.  `MONTH()' is the appropriate function here.  To see
  3. how it works, run a simple query that displays the value of both
  4. `birth' and `MONTH(birth)':
  5.      mysql> SELECT name, birth, MONTH(birth) FROM pet;
  6.      +----------+------------+--------------+
  7.      | name     | birth      | MONTH(birth) |
  8.      +----------+------------+--------------+
  9.      | Fluffy   | 1993-02-04 |            2 |
  10.      | Claws    | 1994-03-17 |            3 |
  11.      | Buffy    | 1989-05-13 |            5 |
  12.      | Fang     | 1990-08-27 |            8 |
  13.      | Bowser   | 1989-08-31 |            8 |
  14.      | Chirpy   | 1998-09-11 |            9 |
  15.      | Whistler | 1997-12-09 |           12 |
  16.      | Slim     | 1996-04-29 |            4 |
  17.      | Puffball | 1999-03-30 |            3 |
  18.      +----------+------------+--------------+
  19. Finding animals with birthdays in the upcoming month is easy, too.
  20. Suppose the current month is April.  Then the month value is `4' and
  21. you look for animals born in May (month 5) like this:
  22.      mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
  23.      +-------+------------+
  24.      | name  | birth      |
  25.      +-------+------------+
  26.      | Buffy | 1989-05-13 |
  27.      +-------+------------+
  28. There is a small complication if the current month is December, of
  29. course.  You don't just add one to the month number (`12') and look for
  30. animals born in month 13, because there is no such month.  Instead, you
  31. look for animals born in January (month 1).
  32. You can even write the query so that it works no matter what the current
  33. month is.  That way you don't have to use a particular month number in
  34. the query.  `DATE_ADD()' allows you to add a time interval to a given
  35. date.  If you add a month to the value of `NOW()', then extract the
  36. month part with `MONTH()', the result produces the month in which to
  37. look for birthdays:
  38.      mysql> SELECT name, birth FROM pet
  39.          -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
  40. A different way to accomplish the same task is to add `1' to get the
  41. next month after the current one (after using the modulo function
  42. (`MOD') to wrap around the month value to `0' if it is currently `12'):
  43.      mysql> SELECT name, birth FROM pet
  44.          -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
  45. Note that `MONTH' returns a number between 1 and 12. And
  46. `MOD(something,12)' returns a number between 0 and 11. So the addition
  47. has to be after the `MOD()' otherwise we would go from November (11) to
  48. January (1).
  49. Working with `NULL' Values
  50. ..........................
  51. The `NULL' value can be surprising until you get used to it.
  52. Conceptually, `NULL' means missing value or unknown value and it is
  53. treated somewhat differently than other values.  To test for `NULL',
  54. you cannot use the arithmetic comparison operators such as `=', `<', or
  55. `!='.  To demonstrate this for yourself, try the following query:
  56.      mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
  57.      +----------+-----------+----------+----------+
  58.      | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
  59.      +----------+-----------+----------+----------+
  60.      |     NULL |      NULL |     NULL |     NULL |
  61.      +----------+-----------+----------+----------+
  62. Clearly you get no meaningful results from these comparisons.  Use the
  63. `IS NULL' and `IS NOT NULL' operators instead:
  64.      mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
  65.      +-----------+---------------+
  66.      | 1 IS NULL | 1 IS NOT NULL |
  67.      +-----------+---------------+
  68.      |         0 |             1 |
  69.      +-----------+---------------+
  70. In *MySQL*, 0 or `NULL' means false and anything else means true.  The
  71. default trueth value from a boolean operation is 1.
  72. This special treatment of `NULL' is why, in the previous section, it
  73. was necessary to determine which animals are no longer alive using
  74. `death IS NOT NULL' instead of `death != NULL'.
  75. Pattern Matching
  76. ................
  77. *MySQL* provides standard SQL pattern matching as well as a form of
  78. pattern matching based on extended regular expressions similar to those
  79. used by Unix utilities such as `vi', `grep', and `sed'.
  80. SQL pattern matching allows you to use `_' to match any single
  81. character and `%' to match an arbitrary number of characters (including
  82. zero characters).  In *MySQL*, SQL patterns are case insensitive by
  83. default.  Some examples are shown below.  Note that you do not use `='
  84. or `!=' when you use SQL patterns; use the `LIKE' or `NOT LIKE'
  85. comparison operators instead.
  86. To find names beginning with `b':
  87.      mysql> SELECT * FROM pet WHERE name LIKE "b%";
  88.      +--------+--------+---------+------+------------+------------+
  89.      | name   | owner  | species | sex  | birth      | death      |
  90.      +--------+--------+---------+------+------------+------------+
  91.      | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
  92.      | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
  93.      +--------+--------+---------+------+------------+------------+
  94. To find names ending with `fy':
  95.      mysql> SELECT * FROM pet WHERE name LIKE "%fy";
  96.      +--------+--------+---------+------+------------+-------+
  97.      | name   | owner  | species | sex  | birth      | death |
  98.      +--------+--------+---------+------+------------+-------+
  99.      | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
  100.      | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
  101.      +--------+--------+---------+------+------------+-------+
  102. To find names containing a `w':
  103.      mysql> SELECT * FROM pet WHERE name LIKE "%w%";
  104.      +----------+-------+---------+------+------------+------------+
  105.      | name     | owner | species | sex  | birth      | death      |
  106.      +----------+-------+---------+------+------------+------------+
  107.      | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
  108.      | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  109.      | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
  110.      +----------+-------+---------+------+------------+------------+
  111. To find names containing exactly five characters, use the `_' pattern
  112. character:
  113.      mysql> SELECT * FROM pet WHERE name LIKE "_____";
  114.      +-------+--------+---------+------+------------+-------+
  115.      | name  | owner  | species | sex  | birth      | death |
  116.      +-------+--------+---------+------+------------+-------+
  117.      | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  118.      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  119.      +-------+--------+---------+------+------------+-------+
  120. The other type of pattern matching provided by *MySQL* uses extended
  121. regular expressions.  When you test for a match for this type of
  122. pattern, use the `REGEXP' and `NOT REGEXP' operators (or `RLIKE' and
  123. `NOT RLIKE', which are synonyms).
  124. Some characteristics of extended regular expressions are:
  125.    * `.' matches any single character.
  126.    * A character class `[...]' matches any character within the
  127.      brackets.  For example, `[abc]' matches `a', `b', or `c'.  To name
  128.      a range of characters, use a dash.  `[a-z]' matches any lowercase
  129.      letter, whereas `[0-9]' matches any digit.
  130.    * `*' matches zero or more instances of the thing preceding it.  For
  131.      example, `x*' matches any number of `x' characters, `[0-9]*'
  132.      matches any number of digits, and `.*' matches any number of
  133.      anything.
  134.    * Regular expressions are case sensitive, but you can use a
  135.      character class to match both lettercases if you wish.  For
  136.      example, `[aA]' matches lowercase or uppercase `a' and `[a-zA-Z]'
  137.      matches any letter in either case.
  138.    * The pattern matches if it occurs anywhere in the value being
  139.      tested.  (SQL patterns match only if they match the entire value.)
  140.    * To anchor a pattern so that it must match the beginning or end of
  141.      the value being tested, use `^' at the beginning or `$' at the end
  142.      of the pattern.
  143. To demonstrate how extended regular expressions work, the `LIKE' queries
  144. shown above are rewritten below to use `REGEXP'.
  145. To find names beginning with `b', use `^' to match the beginning of the
  146. name:
  147.      mysql> SELECT * FROM pet WHERE name REGEXP "^b";
  148.      +--------+--------+---------+------+------------+------------+
  149.      | name   | owner  | species | sex  | birth      | death      |
  150.      +--------+--------+---------+------+------------+------------+
  151.      | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
  152.      | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
  153.      +--------+--------+---------+------+------------+------------+
  154. Prior to MySQL 3.23.4, `REGEXP' is case sensitive, and the previous
  155. query will return no rows. To match either lowercase or uppercase `b',
  156. use this query instead:
  157.      mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
  158. From MySQL 3.23.4 on, to force a `REGEXP' comparison to be case
  159. sensitive, use the `BINARY' keyword to make one of the strings a binary
  160. string. This query will match only lowercase `b' at the beginning of a
  161. name:
  162.      mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";
  163. To find names ending with `fy', use `$' to match the end of the name:
  164.      mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
  165.      +--------+--------+---------+------+------------+-------+
  166.      | name   | owner  | species | sex  | birth      | death |
  167.      +--------+--------+---------+------+------------+-------+
  168.      | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
  169.      | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
  170.      +--------+--------+---------+------+------------+-------+
  171. To find names containing a lowercase or uppercase `w', use this query:
  172.      mysql> SELECT * FROM pet WHERE name REGEXP "w";
  173.      +----------+-------+---------+------+------------+------------+
  174.      | name     | owner | species | sex  | birth      | death      |
  175.      +----------+-------+---------+------+------------+------------+
  176.      | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
  177.      | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  178.      | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
  179.      +----------+-------+---------+------+------------+------------+
  180. Because a regular expression pattern matches if it occurs anywhere in
  181. the value, it is not necessary in the previous query to put a wild card
  182. on either side of the pattern to get it to match the entire value like
  183. it would be if you used a SQL pattern.
  184. To find names containing exactly five characters, use `^' and `$' to
  185. match the beginning and end of the name, and five instances of `.' in
  186. between:
  187.      mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
  188.      +-------+--------+---------+------+------------+-------+
  189.      | name  | owner  | species | sex  | birth      | death |
  190.      +-------+--------+---------+------+------------+-------+
  191.      | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  192.      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  193.      +-------+--------+---------+------+------------+-------+
  194. You could also write the previous query using the `{n}'
  195. "repeat-`n'-times" operator:
  196.      mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
  197.      +-------+--------+---------+------+------------+-------+
  198.      | name  | owner  | species | sex  | birth      | death |
  199.      +-------+--------+---------+------+------------+-------+
  200.      | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  201.      | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  202.      +-------+--------+---------+------+------------+-------+
  203. Counting Rows
  204. .............
  205. Databases are often used to answer the question, "How often does a
  206. certain type of data occur in a table?"  For example, you might want to
  207. know how many pets you have, or how many pets each owner has, or you
  208. might want to perform various kinds of censuses on your animals.
  209. Counting the total number of animals you have is the same question as
  210. "How many rows are in the `pet' table?" because there is one record per
  211. pet.  The `COUNT()' function counts the number of non-`NULL' results, so
  212. the query to count your animals looks like this:
  213.      mysql> SELECT COUNT(*) FROM pet;
  214.      +----------+
  215.      | COUNT(*) |
  216.      +----------+
  217.      |        9 |
  218.      +----------+
  219. Earlier, you retrieved the names of the people who owned pets.  You can
  220. use `COUNT()' if you want to find out how many pets each owner has:
  221.      mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
  222.      +--------+----------+
  223.      | owner  | COUNT(*) |
  224.      +--------+----------+
  225.      | Benny  |        2 |
  226.      | Diane  |        2 |
  227.      | Gwen   |        3 |
  228.      | Harold |        2 |
  229.      +--------+----------+
  230. Note the use of `GROUP BY' to group together all records for each
  231. `owner'.  Without it, all you get is an error message:
  232.      mysql> SELECT owner, COUNT(owner) FROM pet;
  233.      ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
  234.      with no GROUP columns is illegal if there is no GROUP BY clause
  235. `COUNT()' and `GROUP BY' are useful for characterizing your data in
  236. various ways.  The following examples show different ways to perform
  237. animal census operations.
  238. Number of animals per species:
  239.      mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
  240.      +---------+----------+
  241.      | species | COUNT(*) |
  242.      +---------+----------+
  243.      | bird    |        2 |
  244.      | cat     |        2 |
  245.      | dog     |        3 |
  246.      | hamster |        1 |
  247.      | snake   |        1 |
  248.      +---------+----------+
  249. Number of animals per sex:
  250.      mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
  251.      +------+----------+
  252.      | sex  | COUNT(*) |
  253.      +------+----------+
  254.      | NULL |        1 |
  255.      | f    |        4 |
  256.      | m    |        4 |
  257.      +------+----------+
  258. (In this output, `NULL' indicates sex unknown.)
  259. Number of animals per combination of species and sex:
  260.      mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
  261.      +---------+------+----------+
  262.      | species | sex  | COUNT(*) |
  263.      +---------+------+----------+
  264.      | bird    | NULL |        1 |
  265.      | bird    | f    |        1 |
  266.      | cat     | f    |        1 |
  267.      | cat     | m    |        1 |
  268.      | dog     | f    |        1 |
  269.      | dog     | m    |        2 |
  270.      | hamster | f    |        1 |
  271.      | snake   | m    |        1 |
  272.      +---------+------+----------+
  273. You need not retrieve an entire table when you use `COUNT()'.  For
  274. example, the previous query, when performed just on dogs and cats,
  275. looks like this:
  276.      mysql> SELECT species, sex, COUNT(*) FROM pet
  277.          -> WHERE species = "dog" OR species = "cat"
  278.          -> GROUP BY species, sex;
  279.      +---------+------+----------+
  280.      | species | sex  | COUNT(*) |
  281.      +---------+------+----------+
  282.      | cat     | f    |        1 |
  283.      | cat     | m    |        1 |
  284.      | dog     | f    |        1 |
  285.      | dog     | m    |        2 |
  286.      +---------+------+----------+
  287. Or, if you wanted the number of animals per sex only for known-sex
  288. animals:
  289.      mysql> SELECT species, sex, COUNT(*) FROM pet
  290.          -> WHERE sex IS NOT NULL
  291.          -> GROUP BY species, sex;
  292.      +---------+------+----------+
  293.      | species | sex  | COUNT(*) |
  294.      +---------+------+----------+
  295.      | bird    | f    |        1 |
  296.      | cat     | f    |        1 |
  297.      | cat     | m    |        1 |
  298.      | dog     | f    |        1 |
  299.      | dog     | m    |        2 |
  300.      | hamster | f    |        1 |
  301.      | snake   | m    |        1 |
  302.      +---------+------+----------+
  303. Using More Than one Table
  304. -------------------------
  305. The `pet' table keeps track of which pets you have.  If you want to
  306. record other information about them, such as events in their lives like
  307. visits to the vet or when litters are born, you need another table.
  308. What should this table look like? It needs:
  309.    * To contain the pet name so you know which animal each event
  310.      pertains to.
  311.    * A date so you know when the event occurred.
  312.    * A field to describe the event.
  313.    * An event type field, if you want to be able to categorize events.
  314. Given these considerations, the `CREATE TABLE' statement for the
  315. `event' table might look like this:
  316.      mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
  317.          -> type VARCHAR(15), remark VARCHAR(255));
  318. As with the `pet' table, it's easiest to load the initial records by
  319. creating a tab-delimited text file containing the information:
  320. Fluffy      1995-05-15  litter      4 kittens, 3 female, 1 male
  321. Buffy       1993-06-23  litter      5 puppies, 2 female, 3 male
  322. Buffy       1994-06-19  litter      3 puppies, 3 female
  323. Chirpy      1999-03-21  vet         needed beak straightened
  324. Slim        1997-08-03  vet         broken rib
  325. Bowser      1991-10-12  kennel      
  326. Fang        1991-10-12  kennel      
  327. Fang        1998-08-28  birthday    Gave him a new chew toy
  328. Claws       1998-03-17  birthday    Gave him a new flea collar
  329. Whistler    1998-12-09  birthday    First birthday
  330. Load the records like this:
  331.      mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
  332. Based on what you've learned from the queries you've run on the `pet'
  333. table, you should be able to perform retrievals on the records in the
  334. `event' table; the principles are the same.  But when is the `event'
  335. table by itself insufficient to answer questions you might ask?
  336. Suppose you want to find out the ages of each pet when they had their
  337. litters.  The `event' table indicates when this occurred, but to
  338. calculate the age of the mother, you need her birth date.  Because that
  339. is stored in the `pet' table, you need both tables for the query:
  340.      mysql> SELECT pet.name, (TO_DAYS(date) - TO_DAYS(birth))/365 AS age, remark
  341.          -> FROM pet, event
  342.          -> WHERE pet.name = event.name AND type = "litter";
  343.      +--------+------+-----------------------------+
  344.      | name   | age  | remark                      |
  345.      +--------+------+-----------------------------+
  346.      | Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
  347.      | Buffy  | 4.12 | 5 puppies, 2 female, 3 male |
  348.      | Buffy  | 5.10 | 3 puppies, 3 female         |
  349.      +--------+------+-----------------------------+
  350. There are several things to note about this query:
  351.    * The `FROM' clause lists two tables because the query needs to pull
  352.      information from both of them.
  353.    * When combining (joining) information from multiple tables, you
  354.      need to specify how records in one table can be matched to records
  355.      in the other.  This is easy because they both have a `name'
  356.      column.  The query uses `WHERE' clause to match up records in the
  357.      two tables based on the `name' values.
  358.    * Because the `name' column occurs in both tables, you must be
  359.      specific about which table you mean when referring to the column.
  360.      This is done by prepending the table name to the column name.
  361. You need not have two different tables to perform a join.  Sometimes it
  362. is useful to join a table to itself, if you want to compare records in
  363. a table to other records in that same table.  For example, to find
  364. breeding pairs among your pets, you can join the `pet' table with
  365. itself to pair up males and females of like species:
  366.      mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
  367.          -> FROM pet AS p1, pet AS p2
  368.          -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
  369.      +--------+------+--------+------+---------+
  370.      | name   | sex  | name   | sex  | species |
  371.      +--------+------+--------+------+---------+
  372.      | Fluffy | f    | Claws  | m    | cat     |
  373.      | Buffy  | f    | Fang   | m    | dog     |
  374.      | Buffy  | f    | Bowser | m    | dog     |
  375.      +--------+------+--------+------+---------+
  376. In this query, we specify aliases for the table name in order to refer
  377. to the columns and keep straight which instance of the table each
  378. column reference is associated with.
  379. Getting Information About Databases and Tables
  380. ==============================================
  381. What if you forget the name of a database or table, or what the
  382. structure of a given table is (for example, what its columns are
  383. called)?  *MySQL* addresses this problem through several statements
  384. that provide information about the databases and tables it supports.
  385. You have already seen `SHOW DATABASES', which lists the databases
  386. managed by the server.  To find out which database is currently
  387. selected, use the `DATABASE()' function:
  388.      mysql> SELECT DATABASE();
  389.      +------------+
  390.      | DATABASE() |
  391.      +------------+
  392.      | menagerie  |
  393.      +------------+
  394. If you haven't selected any database yet, the result is blank.
  395. To find out what tables the current database contains (for example, when
  396. you're not sure about the name of a table), use this command:
  397.      mysql> SHOW TABLES;
  398.      +---------------------+
  399.      | Tables in menagerie |
  400.      +---------------------+
  401.      | event               |
  402.      | pet                 |
  403.      +---------------------+
  404. If you want to find out about the structure of a table, the `DESCRIBE'
  405. command is useful; it displays information about each of a table's
  406. columns:
  407.      mysql> DESCRIBE pet;
  408.      +---------+-------------+------+-----+---------+-------+
  409.      | Field   | Type        | Null | Key | Default | Extra |
  410.      +---------+-------------+------+-----+---------+-------+
  411.      | name    | varchar(20) | YES  |     | NULL    |       |
  412.      | owner   | varchar(20) | YES  |     | NULL    |       |
  413.      | species | varchar(20) | YES  |     | NULL    |       |
  414.      | sex     | char(1)     | YES  |     | NULL    |       |
  415.      | birth   | date        | YES  |     | NULL    |       |
  416.      | death   | date        | YES  |     | NULL    |       |
  417.      +---------+-------------+------+-----+---------+-------+
  418. `Field' indicates the column name, `Type' is the data type for the
  419. column, `Null' indicates whether or not the column can contain `NULL'
  420. values, `Key' indicates whether or not the column is indexed, and
  421. `Default' specifies the column's default value.
  422. If you have indexes on a table, `SHOW INDEX FROM tbl_name' produces
  423. information about them.
  424. Using `mysql' in Batch Mode
  425. ===========================
  426. In the previous sections, you used `mysql' interactively to enter
  427. queries and view the results.  You can also run `mysql' in batch mode.
  428. To do this, put the commands you want to run in a file, then tell
  429. `mysql' to read its input from the file:
  430.      shell> mysql < batch-file
  431. If you need to specify connection parameters on the command line, the
  432. command might look like this:
  433.      shell> mysql -h host -u user -p < batch-file
  434.      Enter password: ********
  435. When you use `mysql' this way, you are creating a script file, then
  436. executing the script.
  437. Why use a script?  Here are a few reasons:
  438.    * If you run a query repeatedly (say, every day or every week),
  439.      making it a script allows you to avoid retyping it each time you
  440.      execute it.
  441.    * You can generate new queries from existing ones that are similar
  442.      by copying and editing script files.
  443.    * Batch mode can also be useful while you're developing a query,
  444.      particularly for multiple-line commands or multiple-statement
  445.      sequences of commands.  If you make a mistake, you don't have to
  446.      retype everything.  Just edit your script to correct the error,
  447.      then tell `mysql' to execute it again.
  448.    * If you have a query that produces a lot of output, you can run the
  449.      output through a pager rather than watching it scroll off the top
  450.      of your screen:
  451.           shell> mysql < batch-file | more
  452.    * You can catch the output in a file for further processing:
  453.           shell> mysql < batch-file > mysql.out
  454.    * You can distribute your script to other people so they can run the
  455.      commands, too.
  456.    * Some situations do not allow for interactive use, for example,
  457.      when you run a query from a `cron' job.  In this case, you must
  458.      use batch mode.
  459. The default output format is different (more concise) when you run
  460. `mysql' in batch mode than when you use it interactively.  For example,
  461. the output of `SELECT DISTINCT species FROM pet' looks like this when
  462. run interactively:
  463.      +---------+
  464.      | species |
  465.      +---------+
  466.      | bird    |
  467.      | cat     |
  468.      | dog     |
  469.      | hamster |
  470.      | snake   |
  471.      +---------+
  472. But like this when run in batch mode:
  473.      species
  474.      bird
  475.      cat
  476.      dog
  477.      hamster
  478.      snake
  479. If you want to get the interactive output format in batch mode, use
  480. `mysql -t'.  To echo to the output the commands that are executed, use
  481. `mysql -vvv'.
  482. Queries from Twin Project
  483. =========================
  484. At Analytikerna and Lentus, we have been doing the systems and field
  485. work for a big research project. This project is a collaboration
  486. between the Institute of Environmental Medicine at Karolinska
  487. Institutet Stockholm and the Section on Clinical Research in Aging and
  488. Psychology at the University of Southern California.
  489. The project involves a screening part where all twins in Sweden older
  490. than 65 years are interviewed by telephone. Twins who meet certain
  491. criteria are passed on to the next stage. In this latter stage, twins
  492. who want to participate are visited by a doctor/nurse team. Some of the
  493. examinations include physical and neuropsychological examination,
  494. laboratory testing, neuroimaging, psychological status assessment, and
  495. family history collection. In addition, data are collected on medical
  496. and environmental risk factors.
  497. More information about Twin studies can be found at:
  498.      <http://www.imm.ki.se/TWIN/TWINUKW.HTM>
  499. The latter part of the project is administered with a Web interface
  500. written using Perl and *MySQL*.
  501. Each night all data from the interviews are moved into a *MySQL*
  502. database.
  503. Find all Non-distributed Twins
  504. ------------------------------
  505. The following query is used to determine who goes into the second part
  506. of the project:
  507.      select
  508.              concat(p1.id, p1.tvab) + 0 as tvid,
  509.              concat(p1.christian_name, " ", p1.surname) as Name,
  510.              p1.postal_code as Code,
  511.              p1.city as City,
  512.              pg.abrev as Area,
  513.              if(td.participation = "Aborted", "A", " ") as A,
  514.              p1.dead as dead1,
  515.              l.event as event1,
  516.              td.suspect as tsuspect1,
  517.              id.suspect as isuspect1,
  518.              td.severe as tsevere1,
  519.              id.severe as isevere1,
  520.              p2.dead as dead2,
  521.              l2.event as event2,
  522.              h2.nurse as nurse2,
  523.              h2.doctor as doctor2,
  524.              td2.suspect as tsuspect2,
  525.              id2.suspect as isuspect2,
  526.              td2.severe as tsevere2,
  527.              id2.severe as isevere2,
  528.              l.finish_date
  529.      from
  530.              twin_project as tp
  531.              /* For Twin 1 */
  532.              left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
  533.              left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
  534.              left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
  535.              left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
  536.              /* For Twin 2 */
  537.              left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
  538.              left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
  539.              left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
  540.              left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
  541.              person_data as p1,
  542.              person_data as p2,
  543.              postal_groups as pg
  544.      where
  545.              /* p1 gets main twin and p2 gets his/her twin. */
  546.              /* ptvab is a field inverted from tvab */
  547.              p1.id = tp.id and p1.tvab = tp.tvab and
  548.              p2.id = p1.id and p2.ptvab = p1.tvab and
  549.              /* Just the sceening survey */
  550.              tp.survey_no = 5 and
  551.              /* Skip if partner died before 65 but allow emigration (dead=9) */
  552.              (p2.dead = 0 or p2.dead = 9 or
  553.               (p2.dead = 1 and
  554.                (p2.death_date = 0 or
  555.                 (((to_days(p2.death_date) - to_days(p2.birthday)) / 365)
  556.                  >= 65))))
  557.              and
  558.              (
  559.              /* Twin is suspect */
  560.              (td.future_contact = 'Yes' and td.suspect = 2) or
  561.              /* Twin is suspect - Informant is Blessed */
  562.              (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
  563.              /* No twin - Informant is Blessed */
  564.              (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
  565.              /* Twin broken off - Informant is Blessed */
  566.              (td.participation = 'Aborted'
  567.               and id.suspect = 1 and id.future_contact = 'Yes') or
  568.              /* Twin broken off - No inform - Have partner */
  569.              (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
  570.              and
  571.              l.event = 'Finished'
  572.              /* Get at area code */
  573.              and substring(p1.postal_code, 1, 2) = pg.code
  574.              /* Not already distributed */
  575.              and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
  576.              /* Has not refused or been aborted */
  577.              and not (h.status = 'Refused' or h.status = 'Aborted'
  578.              or h.status = 'Died' or h.status = 'Other')
  579.      order by
  580.              tvid;
  581. Some explanations:
  582. `concat(p1.id, p1.tvab) + 0 as tvid'
  583.      We want to sort on the concatenated `id' and `tvab' in numerical
  584.      order. Adding `0' to the result causes *MySQL* to treat the result
  585.      as a number.
  586. column `id'
  587.      This identifies a pair of twins. It is a key in all tables.
  588. column `tvab'
  589.      This identifies a twin in a pair. It has a value of `1' or `2'.
  590. column `ptvab'
  591.      This is an inverse of `tvab'. When `tvab' is `1' this is `2', and
  592.      vice versa. It exists to save typing and to make it easier for
  593.      *MySQL* to optimize the query.
  594. This query demonstrates, among other things, how to do lookups on a
  595. table from the same table with a join (`p1' and `p2'). In the example,
  596. this is used to check whether a twin's partner died before the age of
  597. 65. If so, the row is not returned.
  598. All of the above exist in all tables with twin-related information. We
  599. have a key on both `id,tvab' (all tables), and `id,ptvab'
  600. (`person_data') to make queries faster.
  601. On our production machine (A 200MHz UltraSPARC), this query returns
  602. about 150-200 rows and takes less than one second.
  603. The current number of records in the tables used above:
  604. *Table*                *Rows*
  605. `person_data'          71074
  606. `lentus'               5291
  607. `twin_project'         5286
  608. `twin_data'            2012
  609. `informant_data'       663
  610. `harmony'              381
  611. `postal_groups'        100
  612. Show a Table on Twin Pair Status
  613. --------------------------------
  614. Each interview ends with a status code called `event'. The query shown
  615. below is used to display a table over all twin pairs combined by event.
  616. This indicates in how many pairs both twins are finished, in how many
  617. pairs one twin is finished and the other refused, and so on.
  618.      select
  619.              t1.event,
  620.              t2.event,
  621.              count(*)
  622.      from
  623.              lentus as t1,
  624.              lentus as t2,
  625.              twin_project as tp
  626.      where
  627.              /* We are looking at one pair at a time */
  628.              t1.id = tp.id
  629.              and t1.tvab=tp.tvab
  630.              and t1.id = t2.id
  631.              /* Just the sceening survey */
  632.              and tp.survey_no = 5
  633.              /* This makes each pair only appear once */
  634.              and t1.tvab='1' and t2.tvab='2'
  635.      group by
  636.              t1.event, t2.event;
  637. MySQL Server Functions
  638. **********************
  639. What Languages Are Supported by MySQL?
  640. ======================================
  641. `mysqld' can issue error messages in the following languages: Czech,
  642. Danish, Dutch, English (the default), Estonian, French, German, Greek,
  643. Hungarian, Italian, Japanese, Korean, Norwegian, Norwegian-ny, Polish,
  644. Portuguese, Romanian, Russian, Slovak, Spanish, and Swedish.
  645. To start `mysqld' with a particular language, use either the
  646. `--language=lang' or `-L lang' options. For example:
  647.      shell> mysqld --language=swedish
  648. or:
  649.      shell> mysqld --language=/usr/local/share/swedish
  650. Note that all language names are specified in lowercase.
  651. The language files are located (by default) in
  652. `MYSQL_BASE_DIR/share/LANGUAGE/'.
  653. To update the error message file, you should edit the `errmsg.txt' file
  654. and execute the following command to generate the `errmsg.sys' file:
  655.      shell> comp_err errmsg.txt errmsg.sys
  656. If you upgrade to a newer version of *MySQL*, remember to repeat your
  657. changes with the new `errmsg.txt' file.
  658. The Character Set Used for Data and Sorting
  659. -------------------------------------------
  660. By default, *MySQL* uses the ISO-8859-1 (Latin1) character set. This is
  661. the character set used in the USA and western Europe.
  662. All standard *MySQL* binaries are compiled with
  663. `--with-extra-charsets=complex'.  This will add code to all standard
  664. programs to be able to handle `latin1' and all multi-byte character
  665. sets within the binary. Other character sets will be loaded from a
  666. character-set definition file when needed.
  667. The character set determines what characters are allowed in names and
  668. how things are sorted by the `ORDER BY' and `GROUP BY' clauses of the
  669. `SELECT' statement.
  670. You can change the character set with the `--default-character-set'
  671. option when you start the server.  The character sets available depend
  672. on the `--with-charset=charset' option to `configure', and the
  673. character set configuration files listed in `SHAREDIR/charsets/Index'.
  674. *Note Quick install::.
  675. If you change the character set when running MySQL (which may also
  676. change the sort order), you must run myisamchk -r -q on all tables.
  677. Otherwise your indexes may not be ordered correctly.
  678. When a client connects to a *MySQL* server, the server sends the
  679. default character set in use to the client.  The client will switch to
  680. use this character set for this connection.
  681. One should use `mysql_real_escape_string()' when escaping strings for a
  682. SQL query.  `mysql_real_escape_string()' is identical to the old
  683. `mysql_escape_string()' function, except that it takes the MYSQL
  684. connection handle as the first parameter.
  685. If the client is compiled with different paths than where the server is
  686. installed and the user who configured *MySQL* didn't included all
  687. character sets in the *MySQL* binary, one must specify for the client
  688. where it can find the additional character sets it will need if the
  689. server runs with a different character set than the client.
  690. One can specify this by putting in a *MySQL* option file:
  691.      [client]
  692.      character-sets-dir=/usr/local/mysql/share/mysql/charsets
  693. where the path points to where the dynamic *MySQL* character sets are
  694. stored.
  695. One can force the client to use specific character set by specifying:
  696.      [client]
  697.      default-character-set=character-set-name
  698. but normally this is never needed.
  699. Adding a New Character Set
  700. --------------------------
  701. To add another character set to *MySQL*, use the following procedure.
  702. Decide if the set is simple or complex.  If the character set does not
  703. need to use special string collating routines for sorting and does not
  704. need multi-byte character support, it is simple.  If it needs either of
  705. those features, it is complex.
  706. For example, `latin1' and `danish' are simple charactersets while
  707. `big5' or `czech' are complex character sets.
  708. In the following section, we have assumed that you name your character
  709. set `MYSET'.
  710. For a simple character set do the following:
  711.   1. Add MYSET to the end of the `sql/share/charsets/Index' file Assign
  712.      an unique number to it.
  713.   2. Create the file `sql/share/charsets/MYSET.conf'.  (You can use
  714.      `sql/share/charsets/latin1.conf' as a base for this).
  715.      The syntax for the file very simple:
  716.         * Comments start with a '#' character and proceed to the end of
  717.           the line.
  718.         * Words are separated by arbitrary amounts of whitespace.
  719.         * When defining the character set, every word must be a number
  720.           in hexadecimal format
  721.         * The `ctype' array takes up the first 257 words. The
  722.           `to_lower', `to_upper' and `sort_order' arrays take up 256
  723.           words each after that.
  724.      *Note Character arrays::.
  725.   3. Add the character set name to the `CHARSETS_AVAILABLE' and
  726.      `COMPILED_CHARSETS' lists in `configure.in'.
  727.   4. Reconfigure, recompile, and test.
  728. For a complex character set do the following:
  729.   1. Create the file `strings/ctype-MYSET.c' in the *MySQL* source
  730.      distribution.
  731.   2. Add MYSET to the end of the `sql/share/charsets/Index' file.
  732.      Assign an unique number to it.
  733.   3. Look at one of the existing `ctype-*.c' files to see what needs to
  734.      be defined, for example `strings/ctype-big5.c'. Note that the
  735.      arrays in your file must have names like `ctype_MYSET',
  736.      `to_lower_MYSET', and so on.  This corresponds to the arrays in
  737.      the simple character set. *Note Character arrays::.  For a complex
  738.      character set
  739.   4. Near the top of the file, place a special comment like this:
  740.           /*
  741.            * This comment is parsed by configure to create ctype.c,
  742.            * so don't change it unless you know what you are doing.
  743.            *
  744.            * .configure. number_MYSET=MYNUMBER
  745.            * .configure. strxfrm_multiply_MYSET=N
  746.            * .configure. mbmaxlen_MYSET=N
  747.            */
  748.      The `configure' program uses this comment to include the character
  749.      set into the *MySQL* library automatically.
  750.      The strxfrm_multiply and mbmaxlen lines will be explained in the
  751.      following sections.  Only include them if you the string collating
  752.      functions or the multi-byte character set functions, respectively.
  753.   5. You should then create some of the following functions:
  754.         * `my_strncoll_MYSET()'
  755.         * `my_strcoll_MYSET()'
  756.         * `my_strxfrm_MYSET()'
  757.         * `my_like_range_MYSET()'
  758.      *Note String collating::.
  759.   6. Add the character set name to the `CHARSETS_AVAILABLE' and
  760.      `COMPILED_CHARSETS' lists in `configure.in'.
  761.   7. Reconfigure, recompile, and test.
  762. The file `sql/share/charsets/README' includes some more instructions.
  763. If you want to have the character set included in the *MySQL*
  764. distribution, mail a patch to <internals@lists.mysql.com>.
  765. The character definition arrays
  766. -------------------------------
  767. `to_lower[]' and `to_upper[]' are simple arrays that hold the lowercase
  768. and uppercase characters corresponding to each member of the character
  769. set.  For example:
  770.      to_lower['A'] should contain 'a'
  771.      to_upper['a'] should contain 'A'
  772. `sort_order[]' is a map indicating how characters should be ordered for
  773. comparison and sorting purposes.  For many character sets, this is the
  774. same as `to_upper[]' (which means sorting will be case insensitive).
  775. *MySQL* will sort characters based on the value of
  776. `sort_order[character]'.  For more complicated sorting rules, see the
  777. discussion of string collating below. *Note String collating::.
  778. `ctype[]' is an array of bit values, with one element for one character.
  779. (Note that `to_lower[]', `to_upper[]', and `sort_order[]' are indexed
  780. by character value, but `ctype[]' is indexed by character value + 1.
  781. This is an old legacy to be able to handle EOF.)
  782. You can find the following bitmask definitions in `m_ctype.h':
  783.      #define _U      01      /* Uppercase */
  784.      #define _L      02      /* Lowercase */
  785.      #define _N      04      /* Numeral (digit) */
  786.      #define _S      010     /* Spacing character */
  787.      #define _P      020     /* Punctuation */
  788.      #define _C      040     /* Control character */
  789.      #define _B      0100    /* Blank */
  790.      #define _X      0200    /* heXadecimal digit */
  791. The `ctype[]' entry for each character should be the union of the
  792. applicable bitmask values that describe the character.  For example,
  793. `'A'' is an uppercase character (`_U') as well as a hexadecimal digit
  794. (`_X'), so `ctype['A'+1]' should contain the value:
  795.      _U + _X = 01 + 0200 = 0201
  796. String Collating Support
  797. ------------------------
  798. If the sorting rules for your language are too complex to be handled
  799. with the simple `sort_order[]' table, you need to use the string
  800. collating functions.
  801. Right now the best documentation on this is the character sets that are
  802. already implemented.  Look at the big5, czech, gbk, sjis, and tis160
  803. character sets for examples.
  804. You must specify the `strxfrm_multiply_MYSET=N' value in the special
  805. comment at the top of the file.  `N' should be set to the maximum ratio
  806. the strings may grow during `my_strxfrm_MYSET' (it must be a positive
  807. integer).
  808. Multi-byte Character Support
  809. ----------------------------
  810. If your want to add support for a new character set that includes
  811. multi-byte characters, you need to use the multi-byte character
  812. functions.
  813. Right now the best documentation on this is the character sets that are
  814. already implemented.  Look at the euc_kr, gb2312, gbk, sjis and ujis
  815. character sets for examples. These are implemented in the
  816. `ctype-'charset'.c' files in the `strings' directory.
  817. You must specify the `mbmaxlen_MYSET=N' value in the special comment at
  818. the top of the source file.  `N' should be set to the size in bytes of
  819. the largest character in the set.
  820. How Big MySQL Tables Can Be
  821. ===========================
  822. *MySQL* Version 3.22 has a 4G limit on table size. With the new
  823. `MyISAM' in *MySQL* Version 3.23 the maximum table size is pushed up to
  824. 8 million terabytes (2 ^ 63 bytes).
  825. Note, however, that operating systems have their own file size limits.
  826. Here are some examples:
  827. *Operating System*                   *File Size Limit*
  828. Linux-Intel 32 bit                   2G, 4G or bigger depending on Linux
  829.                                      version
  830. Linux-Alpha                          8T (?)
  831. Solaris 2.5.1                        2G (possible 4G with patch)
  832. Solaris 2.6                          4G
  833. Solaris 2.7 Intel                    4G
  834. Solaris 2.7 ULTRA-SPARC              8T (?)
  835. On Linux 2.2 you can get bigger tables than 2G by using the LFS patch
  836. for the ext2 file system.  On Linux 2.4 there exists also patches for
  837. ReiserFS to get support for big files.
  838. This means that the table size for *MySQL* is normally limited by the
  839. operating system.
  840. By default, *MySQL* tables have a maximum size of about 4G.  You can
  841. check the maximum table size for a table with the `SHOW TABLE STATUS'
  842. command or with the `myisamchk -dv table_name'.  *Note SHOW::.
  843. If you need bigger tables than 4G (and your operating system supports
  844. this), you should set the `AVG_ROW_LENGTH' and `MAX_ROWS' parameter
  845. when you create your table.  *Note CREATE TABLE::.  You can also set
  846. these later with `ALTER TABLE'. *Note ALTER TABLE::.
  847. If your big table is going to be read-only, you could use `myisampack'
  848. to merge and compress many tables to one.  `myisampack' usually
  849. compresses a table by at least 50%, so you can have, in effect, much
  850. bigger tables.  *Note `myisampack': myisampack.
  851. You can go around the operating system file limit for `MyISAM' data
  852. files by using the `RAID' option. *Note CREATE TABLE::.
  853. Another solution can be the included MERGE library, which allows you to
  854. handle a collection of identical tables as one. *Note MERGE tables:
  855. MERGE.
  856. Replication in MySQL
  857. ********************
  858. Introduction
  859. ============
  860. One way replication can be used is to increase both robustness and
  861. speed. For robustness you can have two systems and can switch to the
  862. backup if you have problems with the master. The extra speed is
  863. achieved by sending a part of the non-updating queries to the replica
  864. server. Of course this only works if non-updating queries dominate, but
  865. that is the normal case.
  866. Starting in Version 3.23.15, *MySQL* supports one-way replication
  867. internally. One server acts as the master, while the other acts as the
  868. slave. Note that one server could play the roles of master in one pair
  869. and slave in the other. The master server keeps a binary log of updates
  870. (*Note Binary log::.) and an index file to binary logs to keep track of
  871. log rotation.  The slave, upon connecting, informs the master where it
  872. left off since the last successfully propagated update, catches up on
  873. the updates, and then blocks and waits for the master to notify it of
  874. the new updates.
  875. Note that if you are replicating a database, all updates to this
  876. database should be done through the master!
  877. On older servers one can use the update log to do simple replication.
  878. *Note Log Replication::.
  879. Another benefit of using replication is that one can get live backups of
  880. the system by doing a backup on a slave instead of doing it on the
  881. master. *Note Backup::.
  882. Replication Implementation Overview
  883. ===================================
  884. *MySQL* replication is based on the server keeping track of all changes
  885. to your database (updates, deletes, etc) in the binary log. (*Note
  886. Binary log::.) and the slave server(s) reading the saved queries from
  887. the master server's binary log so that the slave can execute the same
  888. queries on its copy of the data.
  889. It is *very important* to realize that the binary log is simply a
  890. record starting from a fixed point in time (the moment you enable binary
  891. logging). Any slaves which you set up will need copies of all the data
  892. from your master as it existed the moment that you enabled binary
  893. logging on the master. If you start your slaves with data that doesn't
  894. agree with what was on the master *when the binary log was started*,
  895. your slaves may fail.
  896. A future version (4.0) of *MySQL* will remove the need to keep a
  897. (possibly large) snapshot of data for new slaves that you might wish to
  898. set up through the live backup functionality with no locking required.
  899. However, at this time, it is necessary to block all writes either with a
  900. global read lock or by shutting down the master while taking a snapshot.
  901. Once a slave is properly configured and running, it will simply connect
  902. to the master and wait for updates to process. If the master goes away
  903. or the slave loses connectivity with your master, it will keep trying to
  904. connect every `master-connect-retry' seconds until it is able to
  905. reconnect and resume listening for updates.
  906. Each slave keeps track of where it left off. The master server has no
  907. knowledge of how many slaves there are or which ones are up-to-date at
  908. any given time.
  909. The next section explains the master/slave setup process in more detail.
  910. HOWTO
  911. =====
  912. Below is a quick description of how to set up complete replication on
  913. your current *MySQL* server. It assumes you want to replicate all your
  914. databases and have not configured replication before. You will need to
  915. shutdown your master server briefly to complete the steops outlined
  916. below.
  917.   1. Make sure you have a recent version of *MySQL* installed on the
  918.      master and slave(s).
  919.      Use Version 3.23.29 or higher. Previous releases used a different
  920.      binary log format and had bugs which have been fixed in newer
  921.      releases. Please, do not report bugs until you have verified that
  922.      the problem is present in the latest release.
  923.   2. Set up special a replication user on the master with the `FILE'
  924.      privilege and permission to connect from all the slaves. If the
  925.      user is only doing replication (which is recommended), you don't
  926.      need to grant any additional privileges.
  927.      For example, to create a user named `repl' which can access your
  928.      master from any host, you might use this command:
  929.           GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY '<password>';
  930.   3. Shut down *MySQL* on the master.
  931.           mysqladmin -u root -p<password> shutdown
  932.   4. Snapshot all the data on your master server.
  933.      The easiest way to do this (on Unix) is to simply use *tar* to
  934.      produce an archvie of your entrie data directory. The exact data
  935.      directory location depends on your installation.
  936.           tar -cvf /tmp/mysql-snapshot.tar /path/to/data-dir
  937.      Windows users can use WinZip or similar software to create an
  938.      archive of the data directory.
  939.   5. In `my.cnf' on the master add `log-bin' and `server-id=unique
  940.      number' to the `[mysqld]' section and restart it. It is very
  941.      important that the id of the slave is different from the id of the
  942.      master. Think of `server-id' as something similar to the IP
  943.      address - it uniquely identifies the server instance in the
  944.      comminity of replication partners.
  945.           [mysqld]
  946.           log-bin
  947.           server-id=1
  948.   6. Restart *MySQL* on the master.
  949.   7. Add the following to `my.cnf' on the slave(s):
  950.           master-host=<hostname of the master>
  951.           master-user=<replication user name>
  952.           master-password=<replication user password>
  953.           master-port=<TCP/IP port for master>
  954.           server-id=<some unique number between 2 and 2^32-1>
  955.      replacing the values in <> with what is relevant to your system.
  956.      `server-id' must be different for each server participating in
  957.      replication.  If you don't specify a server-id, it will be set to
  958.      1 if you have not defined `master-host', else it will be set to 2.
  959.      Note that in the case of `server-id' omission the master will
  960.      refuse connections from all slaves, and the slave will refuse to
  961.      connect to a master. Thus, omitting `server-id' is only good for
  962.      backup with a binary log.
  963.   8. Copy the snapshot data into your data directory on your slave(s).
  964.      Make sure that the privileges on the files and directories are
  965.      correct. The user which *MySQL* runs as needs to be able to read
  966.      and write to them, just as on the master.
  967.   9. Restart the slave(s).
  968. After you have done the above, the slave(s) should connect to the master
  969. and catch up on any updates which happened since the snapshot was taken.
  970. If you have forgotten to set `server-id' for the slave you will get the
  971. following error in the error log file:
  972.      Warning: one should set server_id to a non-0 value if master_host is set.
  973.      The server will not act as a slave.
  974. If you have forgot to do this for the master, the slaves will not be
  975. able to connect to the master.
  976. If a slave is not able to replicate for any reason, you will find error
  977. messages in the error log on the slave.
  978. Once a slave is replicating, you will find a file called `master.info'
  979. in the same directory as your error log. The `master.info' file is used
  980. by the slave to keep track of how much of the master's binary log is
  981. has processed. *Do not* remove or edit the file, unless you really know
  982. what you are doing. Even in that case, it is preferred that you use
  983. `CHANGE MASTER TO' command.
  984. Replication Features and known problems
  985. =======================================
  986. Below is an explanation of what is supported and what is not:
  987.    * Replication will be done correctly with `AUTO_INCREMENT',
  988.      `LAST_INSERT_ID', and `TIMESTAMP' values.
  989.    * `RAND()' in updates does not replicate properly. Use
  990.      `RAND(some_non_rand_expr)' if you are replcating updates with
  991.      `RAND()'. You can, for example, use `UNIX_TIMESTAMP()' for the
  992.      argument to `RAND()'.
  993.    * `LOAD DATA INFILE' will be handled properly as long as the file
  994.      still resides on the master server at the time of update
  995.      propagation. `LOAD LOCAL DATA INFILE' will be skipped.
  996.    * Update queries that use user variables are not replication-safe
  997.      (yet).
  998.    * `FLUSH' commands are not stored in the binary log and are because
  999.      of this not replicated to the slaves. This is not normally a
  1000.      problem as `FLUSH' doesn't change anything. This does however mean
  1001.      that if you update the `MySQL' privilege tables directly without
  1002.      using `GRANT' statement and you replicate the `MySQL' privilege
  1003.      database, you must do a `FLUSH PRIVILEGES' on your slaves to put
  1004.      the new privileges into effect.
  1005.    * Temporary tables starting in 3.23.29 are replicated properly with
  1006.      the exception of the case when you shut down slave server ( not
  1007.      just slave thread), you have some temporary tables open, and the
  1008.      are used in subsequent updates.  To deal with this problem, to
  1009.      shut down the slave, do `SLAVE STOP', then check
  1010.      `Slave_open_temp_tables' variable to see if it is 0, then issue
  1011.      `mysqladmin shutdown'. If the number is not 0, restart the slave
  1012.      thread with `SLAVE START' and see if you have better luck next
  1013.      time. There will be a cleaner solution, but it has to wait until
  1014.      version 4.0.  In earlier versions temporary tables are not being
  1015.      replicated properly - we recommend that you either upgrade, or
  1016.      execute `SET SQL_LOG_BIN=0' on your clients before all queries
  1017.      with temp tables.
  1018.    * *MySQL* only supports one master and many slaves. We will in 4.x
  1019.      add a voting algorithm to automaticly change master if something
  1020.      goes wrong with the current master. We will also introduce 'agent'
  1021.      processes to help doing load balancing by sending select queries
  1022.      to different slaves.
  1023.    * Starting in Version 3.23.26, it is safe to connect servers in a
  1024.      circular master-slave relationship with `log-slave-updates'
  1025.      enabled.  Note, however, that many queries will not work right in
  1026.      this kind of setup unless your client code is written to take care
  1027.      of the potential problems that can happen from updates that occur
  1028.      in different sequence on different servers. Note that the log
  1029.      format has changed in Version 3.23.26 so that pre-3.23.26 slaves
  1030.      will not be able to read it.
  1031.    * If the query on the slave gets an error, the slave thread will
  1032.      terminate, and a message will appear in the `.err' file. You should
  1033.      then connect to the slave manually, fix the cause of the error (for
  1034.      example, non-existent table), and then run `SLAVE START' sql
  1035.      command (available starting in Version 3.23.16). In Version
  1036.      3.23.15, you will have to restart the server.
  1037.    * If connection to the master is lost, the slave will retry
  1038.      immediately, and then in case of failure every
  1039.      `master-connect-retry' (default 60) seconds. Because of this, it
  1040.      is safe to shut down the master, and then restart it after a
  1041.      while. The slave will also be able to deal with network
  1042.      connectivity outages.
  1043.    * Shutting down the slave (cleanly) is also safe, as it keeps track
  1044.      of where it left off.  Unclean shutdowns might produce problems,
  1045.      especially if disk cache was not synced before the system died.
  1046.      Your system fault tolerance will be greatly increased if you have
  1047.      a good UPS.
  1048.    * If the master is listening on a non-standard port, you will also
  1049.      need to specify this with `master-port' parameter in `my.cnf' .
  1050.    * In Version 3.23.15, all of the tables and databases will be
  1051.      replicated. Starting in Version 3.23.16, you can restrict
  1052.      replication to a set of databases with `replicate-do-db'
  1053.      directives in `my.cnf' or just exclude a set of databases with
  1054.      `replicate-ignore-db'. Note that up until Version 3.23.23, there
  1055.      was a bug that did not properly deal with `LOAD DATA INFILE' if
  1056.      you did it in a database that was excluded from replication.
  1057.    * Starting in Version 3.23.16, `SET SQL_LOG_BIN = 0' will turn off
  1058.      replication (binary) logging on the master, and `SET SQL_LOG_BIN =
  1059.      1' will turn in back on - you must have the process privilege to do
  1060.      this.
  1061.    * Starting in Version 3.23.19, you can clean up stale replication
  1062.      leftovers when something goes wrong and you want a clean start
  1063.      with `FLUSH MASTER' and `FLUSH SLAVE' commands. In Version 3.23.26
  1064.      we have renamed them to `RESET MASTER' and `RESET SLAVE'
  1065.      respectively to clarify what they do. The old `FLUSH' variants
  1066.      still work, though, for compatibility.
  1067.    * Starting in Version 3.23.21, you can use `LOAD TABLE FROM MASTER'
  1068.      for network backup and to set up replication initially. We have
  1069.      recently received a number of bug reports concerning it that we
  1070.      are investigating, so we recommend that you use it only in testing
  1071.      until we make it more stable.
  1072.    * Starting in Version 3.23.23, you can change masters and adjust log
  1073.      position with `CHANGE MASTER TO'.
  1074.    * Starting in Version 3.23.23, you tell the master that updates in
  1075.      certain databases should not be logged to the binary log with
  1076.      `binlog-ignore-db'.
  1077.    * Starting in Version 3.23.26, you can use `replicate-rewrite-db' to
  1078.      tell the slave to apply updates from one database on the master to
  1079.      the one with a different name on the slave.
  1080.    * Starting in Version 3.23.28, you can use `PURGE MASTER LOGS TO
  1081.      'log-name'' to get rid of old logs while the slave is running.
  1082. Replication Options in my.cnf
  1083. =============================
  1084. If you are using replication, we recommend you to use MySQL Version
  1085. 3.23.30 or later. Older versions work, but they do have some bugs and
  1086. are missing some features.
  1087. On both master and slave you need to use the `server-id' option.  This
  1088. sets an unique replication id. You should pick a unique value in the
  1089. range between 1 to 2^32-1 for each master and slave.  Example:
  1090. `server-id=3'
  1091. The following table has the options you can use for the *MASTER*:
  1092. *Option*               *Description*
  1093. `log-bin=filename'      Write to a binary update log to the specified
  1094.                        location. Note that if you give it a parameter
  1095.                        with an extension (for example,
  1096.                        `log-bin=/mysql/logs/replication.log' ) versions
  1097.                        up to 3.23.24 will not work right during
  1098.                        replication if you do `FLUSH LOGS' . The problem
  1099.                        is fixed in Version 3.23.25. If you are using
  1100.                        this kind of log name, `FLUSH LOGS' will be
  1101.                        ignored on binlog. To clear the log, run `FLUSH
  1102.                        MASTER', and do not forget to run `FLUSH SLAVE'
  1103.                        on all slaves. In Version 3.23.26 and in later
  1104.                        versions you should use `RESET MASTER' and `RESET
  1105.                        SLAVE'
  1106. `log-bin-index=filename' Because the user could issue the `FLUSH LOGS'
  1107.                        command, we need to know which log is currently
  1108.                        active and which ones have been rotated out and
  1109.                        in what sequence. This information is stored in
  1110.                        the binary log index file.  The default is
  1111.                        `hostname`.index. You can use this option if you
  1112.                        want to be a rebel.  (Example:
  1113.                        `log-bin-index=db.index')
  1114. `sql-bin-update-same'   If set, setting `SQL_LOG_BIN' to a value will
  1115.                        automatically set `SQL_LOG_UPDATE' to the same
  1116.                        value and vice versa.
  1117. `binlog-do-db=database_name' Tells the master it should log updates for the
  1118.                        specified database, and exclude all others not
  1119.                        explicitly mentioned.  (Example:
  1120.                        `binlog-do-db=some_database')
  1121. `binlog-ignore-db=database_name' Tells the master that updates to the given
  1122.                        database should not be logged to the binary log
  1123.                        (Example: `binlog-ignore-db=some_database')
  1124. The following table has the options you can use for the *SLAVE*:
  1125. *Option*               *Description*
  1126. `master-host=host'      Master hostname or IP address for replication.
  1127.                        If not set, the slave thread will not be started.
  1128.                        (Example: `master-host=db-master.mycompany.com')
  1129. `master-user=username'  The user the slave thread will us for
  1130.                        authentication when connecting to the master. The
  1131.                        user must have `FILE' privilege. If the master
  1132.                        user is not set, user `test' is assumed.
  1133.                        (Example: `master-user=scott')
  1134. `master-password=password' The password the slave thread will authenticate
  1135.                        with when connecting to the master. If not set,
  1136.                        an empty password is assumed. (Example:
  1137.                        `master-password=tiger')
  1138. `master-port=portnumber' The port the master is listening on. If not set,
  1139.                        the compiled setting of `MYSQL_PORT' is assumed.
  1140.                        If you have not tinkered with `configure'
  1141.                        options, this should be 3306.  (Example:
  1142.                        `master-port=3306')
  1143. `master-connect-retry=seconds' The number of seconds the slave thread will
  1144.                        sleep before retrying to connect to the master in
  1145.                        case the master goes down or the connection is
  1146.                        lost.  Default is 60.  (Example:
  1147.                        `master-connect-retry=60')
  1148. `master-info-file=filename' The location of the file that remembers where we
  1149.                        left off on the master during the replication
  1150.                        process. The default is master.info in the data
  1151.                        directory.  Sasha: The only reason I see for ever
  1152.                        changing the default is the desire to be
  1153.                        rebelious.  (Example:
  1154.                        `master-info-file=master.info')
  1155. `replicate-do-table=db_name.table_name' Tells the slave thread to restrict replication
  1156.                        to the specified database.  To specify more than
  1157.                        one table, use the directive multiple times, once
  1158.                        for each table. .  (Example:
  1159.                        `replicate-do-table=some_db.some_table')
  1160. `replicate-ignore-table=db_name.table_name' Tells the slave thread to not replicate to the
  1161.                        specified table. To specify more than one table
  1162.                        to ignore, use the directive multiple times, once
  1163.                        for each table.(Example:
  1164.                        `replicate-ignore-table=db_name.some_table')
  1165. `replicate-wild-do-table=db_name.table_name' Tells the slave thread to restrict replication
  1166.                        to the tables that match the specified wildcard
  1167.                        pattern. .  To specify more than one table, use
  1168.                        the directive multiple times, once for each
  1169.                        table. .  (Example:
  1170.                        `replicate-do-table=foo%.bar%' will replicate
  1171.                        only updates to tables in all databases that
  1172.                        start with foo and whose table names start with
  1173.                        bar)
  1174. `replicate-wild-ignore-table=db_name.table_name' Tells the slave thread to not replicate to the
  1175.                        tables that match the given wild card pattern. To
  1176.                        specify more than one table to ignore, use the
  1177.                        directive multiple times, once for each
  1178.                        table.(Example:
  1179.                        `replicate-ignore-table=foo%.bar%' - will not
  1180.                        upates to tables in all databases that start with
  1181.                        foo and whose table names start with bar)
  1182. `replicate-ignore-db=database_name' Tells the slave thread to not replicate to the
  1183.                        specified database. To specify more than one
  1184.                        database to ignore, use the directive multiple
  1185.                        times, once for each database. This option will
  1186.                        not work if you use cross database updates. If
  1187.                        you need cross database updates to work, make sure
  1188.                        you have 3.23.28 or later, and use
  1189.                        `replicate-wild-ignore-table=db_name.%'(Example:
  1190.                        `replicate-ignore-db=some_db')
  1191. `replicate-do-db=database_name' Tells the slave thread to restrict replication
  1192.                        to the specified database.  To specify more than
  1193.                        one database, use the directive multiple times,
  1194.                        once for each database. Note that this will only
  1195.                        work if you do not use cross-database queries
  1196.                        such as `UPDATE some_db.some_table SET foo='bar''
  1197.                        while having selected a different or no database.
  1198.                        If you need cross database updates to work, make
  1199.                        sure you have 3.23.28 or later, and use
  1200.                        `replicate-wild-do-table=db_name.%' (Example:
  1201.                        `replicate-do-db=some_db')
  1202. `log-slave-updates'     Tells the slave to log the updates from the
  1203.                        slave thread to the binary log. Off by default.
  1204.                        You will need to turn it on if you plan to
  1205.                        daisy-chain the slaves.
  1206. `replicate-rewrite-db=from_name->to_name' Updates to a database with a different name than
  1207.                        the original (Example:
  1208.                        `replicate-rewrite-db=master_db_name->slave_db_name'
  1209. `skip-slave-start'      Tells the slave server not to start the slave on
  1210.                        the startup.  The user can start it later with
  1211.                        `SLAVE START'.
  1212. SQL Commands Related to Replication
  1213. ===================================
  1214. Replication can be controlled through the SQL interface. Below is the
  1215. summary of commands:
  1216. *Command*              *Description*
  1217. `SLAVE START'          Starts the slave thread. (Slave)
  1218. `SLAVE STOP'           Stops the slave thread. (Slave)
  1219. `SET SQL_LOG_BIN=0'    Disables update logging if the user has process
  1220.                        privilege.   Ignored otherwise. (Master)
  1221. `SET SQL_LOG_BIN=1'    Re-enables update logging if the user has process
  1222.                        privilege.   Ignored otherwise. (Master)
  1223. `SET                   Skip the next `n' events from the master. Only
  1224. SQL_SLAVE_SKIP_COUNTER=n'valid when the slave thread is not running,
  1225.                        otherwise, gives an error. Useful for recovering
  1226.                        from replication glitches.
  1227. `RESET MASTER'         Deletes all binary logs listed in the index file,
  1228.                        resetting the binlog index file to be empty. In
  1229.                        pre-3.23.26 versions, `FLUSH MASTER' (Master)
  1230. `RESET SLAVE'          Makes the slave forget its replication position
  1231.                        in the master logs. In pre 3.23.26 versions the
  1232.                        command was called `FLUSH SLAVE'(Slave)
  1233. `LOAD TABLE tblname    Downloads a copy of the table from master to the
  1234. FROM MASTER'           slave. (Slave)
  1235. `CHANGE MASTER TO      Changes the master parameters to the values
  1236. master_def_list'       specified in `master_def_list' and restarts the
  1237.                        slave thread. `master_def_list' is a
  1238.                        comma-separated list of `master_def' where
  1239.                        `master_def' is one of the following:
  1240.                        `MASTER_HOST', `MASTER_USER', `MASTER_PASSWORD',
  1241.                        `MASTER_PORT', `MASTER_CONNECT_RETRY',
  1242.                        `MASTER_LOG_FILE', `MASTER_LOG_POS'. Example:
  1243.                        
  1244.                        
  1245.                             CHANGE MASTER TO
  1246.                               MASTER_HOST='master2.mycompany.com',
  1247.                               MASTER_USER='replication',
  1248.                               MASTER_PASSWORD='bigs3cret',
  1249.                               MASTER_PORT=3306,
  1250.                               MASTER_LOG_FILE='master2-bin.001',
  1251.                               MASTER_LOG_POS=4;
  1252.                        You only need to specify the values that need to
  1253.                        be changed. The values that you omit will stay
  1254.                        the same with the exception of when you change
  1255.                        the host or the port. In that case, the slave
  1256.                        will assume that since you are connecting to a
  1257.                        different host or a different port, the master is
  1258.                        different. Therefore, the old values of log and
  1259.                        position are not applicable anymore, and will
  1260.                        automatically be reset to an empty string and 0,
  1261.                        respectively (the start values). Note that if you
  1262.                        restart the slave, it will remember its last
  1263.                        master.  If this is not desirable, you should
  1264.                        delete the `master.info' file before restarting,
  1265.                        and the slave will read its master from `my.cnf'
  1266.                        or the command line. (Slave)
  1267. `SHOW MASTER STATUS'   Provides status information on the binlog of the
  1268.                        master. (Master)
  1269. `SHOW SLAVE STATUS'    Provides status information on essential
  1270.                        parameters of the slave thread. (Slave)
  1271. `SHOW MASTER LOGS'     Only available starting in Version 3.23.28. Lists
  1272.                        the binary logs on the master. You should use
  1273.                        this command prior to `PURGE MASTER LOGS TO' to
  1274.                        find out how far you should go.
  1275. `PURGE MASTER LOGS TO  Available starting in Version 3.23.28. Deletes
  1276. 'logname''             all the replication logs that are listed in the
  1277.                        log index as being prior to the specified log,
  1278.                        and removed them from the log index, so that the
  1279.                        given log now becomes first. Example:
  1280.                        
  1281.                             PURGE MASTER LOGS TO 'mysql-bin.010'
  1282.                        This command will do nothing and fail with an
  1283.                        error if you have an active slave that is
  1284.                        currently reading one of the logs you are trying
  1285.                        to delete. However, if you have a dormant slave,
  1286.                        and happen to purge one of the logs it wants to
  1287.                        read, the slave will be unable to replicate once
  1288.                        it comes up.  The command is safe to run while
  1289.                        slaves are replicating - you do not need to stop
  1290.                        them.
  1291.                        
  1292.                        You must first check all the slaves with `SHOW
  1293.                        SLAVE STATUS' to see which log they are on, then
  1294.                        do a listing of the logs on the master with `SHOW
  1295.                        MASTER LOGS', find the earliest log among all the
  1296.                        slaves (if all the slaves are up to date, this
  1297.                        will be the last log on the list), backup all the
  1298.                        logs you are about to delete (optional) and purge
  1299.                        up to the target log.
  1300. Replication FAQ
  1301. ===============
  1302. *Q*: Why do I sometimes see more than one `Binlog_Dump' thread on the
  1303. master after I have restarted the slave?
  1304. *A*: `Binlog_Dump' is a continuous process that is handled by the
  1305. server in the following way:
  1306.    * Catch up on the updates.
  1307.    * Once there are no more updates left, go into `pthread_cond_wait()',
  1308.      from which we can be awakened either by an update or a kill.
  1309.    * On wake up, check the reason. If we are not supposed to die,
  1310.      continue the `Binlog_dump' loop.
  1311.    * If there is some fatal error, such as detecting a dead client,
  1312.      terminate the loop.
  1313. So if the slave thread stops on the slave, the corresponding
  1314. `Binlog_Dump' thread on the master will not notice it until after at
  1315. least one update to the master (or a kill), which is needed to wake it
  1316. up from `pthread_cond_wait()'.  In the meantime, the slave could have
  1317. opened another connection, which resulted in another `Binlog_Dump'
  1318. thread.
  1319. The above problem should not be present in Version 3.23.26 and later
  1320. versions.  In Version 3.23.26 we added `server-id' to each replication
  1321. server, and now all the old zombie threads are killed on the master
  1322. when a new replication thread connects from the same slave
  1323. *Q*: How do I rotate replication logs?
  1324. *A*: In Version 3.23.28 you should use `PURGE MASTER LOGS TO' command
  1325. after determining which logs can be deleted, and optionally backing
  1326. them up first. In earlier versions the process is much more painful,
  1327. and cannot be safely done without stopping all the slaves in the case
  1328. that you plan to re-use log names. You will need to stop the slave
  1329. threads, edit the binary log index file, delete all the old logs,
  1330. restart the master, start slave threads,and then remove the old log
  1331. files.
  1332. *Q*: How do I upgrade on a hot replication setup?
  1333. *A*: If you are upgrading  pre-3.23.26 versions, you should just lock
  1334. the master tables, let the slave catch up, then run `FLUSH MASTER' on
  1335. the master, and `FLUSH SLAVE' on the slave to reset the logs, then
  1336. restart new versions of the master and the slave. Note that the slave
  1337. can stay down for some time - since the master is logging all the
  1338. updates, the slave will be able to catch up once it is up and can
  1339. connect.
  1340. After 3.23.26, we have locked the replication protocol for
  1341. modifications, so you can upgrade masters and slave on the fly to a
  1342. newer 3.23 version and you can have different versions of *MySQL*
  1343. running on the slave and the master, as long as they are both newer
  1344. than 3.23.26.
  1345. *Q*: What issues should I be aware of when setting up two-way
  1346. replication?
  1347. *A*: *MySQL* replication currently does not support any locking
  1348. protocol between master and slave to guarantee the atomicity of a
  1349. distributed (cross-server) update. In in other words, it is possible
  1350. for client A to make an update to  co-master 1, and in the meantime,
  1351. before it propagates to co-master 2, client B could make an update to
  1352. co-master 2 that will make the update of client A work differently than
  1353. it did on co-master 1. Thus when the update of client A will make it to
  1354. co-master 2, it will produce  tables that will be different than what
  1355. you have on co-master 1, even after all the updates from co-master 2
  1356. have also propagated. So you should not co-chain two servers in a
  1357. two-way replication relationship, unless you are sure that you updates
  1358. can safely happen in any order, or unless you take care of mis-ordered
  1359. updates somehow in the client code.
  1360. You must also realize that two-way replication actually does not improve
  1361. performance very much, if at all, as far as updates are concerned. Both
  1362. servers need to do the same amount of updates each, as you would have
  1363. one server do. The only difference is that there will be a little less
  1364. lock contention, because the updates originating on another server will
  1365. be serialized in one slave thread. This benefit, though, might be
  1366. offset by network delays.
  1367. *Q*: How can I use replication to improve performance of my system?
  1368. *A*: You should set up one server as the master, and direct all writes
  1369. to it, and configure as many slaves as you have the money and rackspace
  1370. for, distributing the reads among the master and the slaves.  You can
  1371. also start the slaves with `--skip-bdb', `--low-priority-updates' and
  1372. `--delay-key-write-for-all-tables' to get speed improvements for the
  1373. slave.  In this case the slave will use non-transactional `MyISAM'
  1374. tables instead of `BDB' tables to get more speed.
  1375. *Q*: What should I do to prepare my client code to use
  1376. performance-enhancing replication?
  1377. *A*: If the part of your code that is responsible for database access
  1378. has been properly abstracted/modularized, converting it to run with the
  1379. replicated setup should be very smooth and easy - just change the
  1380. implementation of your database access to read from some slave or the
  1381. master, and to awlays write to the master. If your code does not have
  1382. this level of abstraction, setting up a replicated system will give you
  1383. an opportunity/motivation to it clean up.   You should start by
  1384. creating a wrapper library /module with the following functions:
  1385.    * `safe_writer_connect()'
  1386.    * `safe_reader_connect()'
  1387.    * `safe_reader_query()'
  1388.    * `safe_writer_query()'
  1389. `safe_' means that the function will take care of handling all the
  1390. error conditions.
  1391. You should then convert your client code to use the wrapper library.
  1392. It may be a painful and scary process at first, but it will pay off in
  1393. the long run. All applications that follow the above pattern will be
  1394. able to take advantage of one-master/many slaves solution.  The code
  1395. will be a lot easier to maintain, and adding troubleshooting options
  1396. will be trivial. You will just need to modify one or two functions, for
  1397. example, to log how long each query took, or which query, among your
  1398. many thousands, gave you an error. If you have written a lot of code
  1399. already, you may want to automate the conversion task by using Monty's
  1400. `replace' utility, which comes with the standard distribution of
  1401. *MySQL*, or just write your own Perl script. Hopefully, your code
  1402. follows some recognizable pattern. If not, then you are probably better
  1403. off re-writing it anyway, or at least going through and manually
  1404. beating it into a pattern.
  1405. Note that, of course, you can use different names for the functions.
  1406. What is important is having unified interface for connecting for reads,
  1407. connecting for writes, doing a read, and doing a write.
  1408. *Q*: When and how much can *MySQL* replication improve the performance
  1409. of my system?
  1410. *A*: *MySQL* replication is most beneficial for a system with frequent
  1411. reads and not so frequent writes. In theory, by using a one master/many
  1412. slaves setup you can scale by adding more slaves until you either run
  1413. out of network bandwidth, or your update load grows to the point that
  1414. the master cannot handle it.
  1415. In order to determine how many slaves you can get before the added
  1416. benefits begin to level out, and how much you can improve performance
  1417. of your site, you need to know your query patterns, and empirically
  1418. (by benchmarking) determine the relationship between the throughput on
  1419. reads (reads per second, or `max_reads') and on writes `max_writes') on
  1420. a typical master and a typical slave. The example below will show you a
  1421. rather simplified calculation of what you can get with replication for
  1422. our imagined system.
  1423. Let's say our system load consists of 10% writes and 90% reads, and we
  1424. have determined that `max_reads' = 1200 - 2 * `max_writes', or in other
  1425. words, our system can do 1200 reads per second with no writes, our
  1426. average write is twice as slow as average read, and the relationship is
  1427. linear. Let us suppose that our master and slave are of the same
  1428. capacity, and we have N slaves and 1 master. Then we have for each
  1429. server (master or slave):
  1430. `reads = 1200 - 2 * writes' (from bencmarks)
  1431. `reads = 9* writes / (N + 1) ' (reads split, but writes go to all
  1432. servers)
  1433. `9*writes/(N+1) + 2 * writes = 1200'
  1434. `writes = 1200/(2 + 9/(N+1)'
  1435. So if N = 0, which means we have no replication, our system can handle
  1436. 1200/11, about 109 writes per second (which means we will have 9 times
  1437. as many reads due to the nature of our application).
  1438. If N = 1, we can get up to 184 writes per second.
  1439. If N = 8, we get up to 400.
  1440. If N = 17, 480 writes.
  1441. Eventually as N approaches infinity (and our budget negative infinity),
  1442. we can get very close to 600 writes per second, increasing system
  1443. throughput about 5.5 times. However, with only 8 servers, we increased
  1444. it almost 4 times already.
  1445. Note that our computations assumed infinite network bandwidth, and
  1446. neglected several other factors that could turn out to be signficant on
  1447. your system. In many cases, you may not be able to make a computation
  1448. similar to the one above that will accurately predict what will happen
  1449. on your system if you add N replication slaves. However, answering the
  1450. following questions should help you decided whether and how much, if at
  1451. all, the replication will improve the performance of your system:
  1452.    * What is the read/write ratio on your system?
  1453.    * How much more write load can one server handle if you reduce the
  1454.      reads?
  1455.    * How many slaves do you have bandwidth for on your network?
  1456. *Q*: How can I use replication to provide redundancy/high availability?
  1457. *A*: With the currently available features, you would have to set up a
  1458. master and a slave (or several slaves), and write a script that will
  1459. monitor the master to see if it is up, and instruct your applications
  1460. and the slaves of the master change in case of failure. Some
  1461. suggestions:
  1462.    * To tell a slave to change the master use the `CHANGE MASTER TO'
  1463.      command.
  1464.    * A good way to keep your applications informed where the master is
  1465.      by having a dynamic DNS entry for the master. With *bind* you can
  1466.      use `nsupdate' to dynamically update your DNS.
  1467.    * You should run your slaves with the `log-bin' option and without
  1468.      `log-slave-updates'. This way the slave will be ready to become a
  1469.      master as soon as you issue `STOP SLAVE'; `RESET MASTER', and
  1470.      `CHANGE MASTER TO' on the other slaves. It will also help you catch
  1471.      spurious updates that may happen because of misconfiguration of the
  1472.      slave (ideally, you want to configure access rights so that no
  1473.      client can update the slave, except for the slave thread) combined
  1474.      with the bugs in your client programs (they should never update
  1475.      the slave directly).
  1476. We are currently working on intergrating an automatic master election
  1477. system into *MySQL*, but until it is ready, you will have to create
  1478. your own monitoring tools.
  1479. Troubleshooting Replication
  1480. ===========================
  1481. If you have followed the instructions, and your replication setup is not
  1482. working, first elliminate the user error factor by checking the
  1483. following:
  1484.    * Is the master logging to the binary log? Check with `SHOW MASTER
  1485.      STATUS'.  If it is, `Position' will be non-zero. If not, verify
  1486.      that you have given the master `log-bin' option and have set
  1487.      `server-id'.
  1488.    * Is the slave running? Check with `SHOW SLAVE STATUS'. The answer
  1489.      is found in `Slave_running' column. If not, verify slave options
  1490.      and check the error log for messages.
  1491.    * If the slave is running, did it establish connection with the
  1492.      master? Do `SHOW PROCESSLIST', find the thread with `system user'
  1493.      value in `User' column and `none' in the `Host' column, and check
  1494.      the `State' column. If it says `connecting to master', verify the
  1495.      privileges for the replication user on the master, master host
  1496.      name, your DNS setup, whether the master is actually running,
  1497.      whether it is reachable from the slave, and if all that seems ok,
  1498.      read the error logs.
  1499.    * If the slave was running, but then stopped, look at SHOW SLAVE
  1500.      STATUS output andcheck the error logs. It usually happens when
  1501.      some query that succeeded on the master fails on the slave. This
  1502.      should never happen if you have taken a proper snapshot of the
  1503.      master, and never modify the data on the slave outside of the
  1504.      slave thread. If it does, it is a bug, read below on how to report
  1505.      it.
  1506.    * If a query on that succeeded on the master refuses to run on the
  1507.      slave, and a full database resync ( the proper thing to do ) does
  1508.      not seem feasible, try the following:
  1509.         bullet First see if there is some stray record in the way.
  1510.           Understand how it got there, then delete it and run `SLAVE
  1511.           START'
  1512.         bullet If the above does not work or does not apply, try to
  1513.           understand if it would be safe to make the update manually (
  1514.           if needed) and then ignore the next query from the master.
  1515.         bullet If you have decided you can skip the next query, do `SET
  1516.           SQL_SLAVE_SKIP_COUNTER=1; SLAVE START;' to skip a query that
  1517.           does not use auto_increment, last_insert_id or timestamp, or
  1518.           `SET SQL_SLAVE_SKIP_COUNTER=2; SLAVE START;' otherwise
  1519.         bullet If you are sure the slave started out perfectly in sync
  1520.           with the master, and no one has updated  the tables involved
  1521.           outside of slave thread, report the bug, so you will not have
  1522.           to do the above tricks again.
  1523.    * Make sure you are not running into an old bug by upgrading to the
  1524.      most recent version.
  1525.    * If all else fails, read the error logs. If they are big, `grep -i
  1526.      slave /path/to/your-log.err' on the slave. There is no generic
  1527.      pattern to search for on the master, as the only errors it logs
  1528.      are general system errors - if it can, it will send the error to
  1529.      the slave when things go wrong.
  1530. When you have determined that there is no user error involved, and
  1531. replication still either does not work at all or is unstable, it is
  1532. time to start working on a bug report. We need to get as much info as
  1533. possible from you to be able to track down the bug. Please do spend
  1534. some time and effort preparing a good bug report. Ideally, we would
  1535. like to have a test case in the format found in `mysql-test/t/rpl*'
  1536. directory of the source tree. If you submit a test case like that, you
  1537. can expect a patch within a day or two in most cases, although, of
  1538. course, you mileage may vary depending on a number of factors.
  1539. Second best option is a just program with easily configurable connection
  1540. arguments for the master and the slave that will demonstrate the
  1541. problem on our systems. You can write one in Perl or in C, depending on
  1542. which language you know better.
  1543. If you have one of the above ways to demonstrate the bug, use
  1544. `mysqlbug' to prepare a bug report and send it to
  1545. <bugs@lists.mysql.com>. If you have a phantom - a problem that does
  1546. occur but you cannot duplicate "at will":
  1547.    * Verify that there is no user error involved. For example, if you
  1548.      update the slave outside of the slave thread, the data will be out
  1549.      of sync, and you can have unique key violations on updates, in
  1550.      which case the slave thread will stop and wait for you to clean up
  1551.      the tables manually to bring them in sync.
  1552.    * Run slave with `log-slave-updates' and `log-bin' - this will keep
  1553.      a log of all updates on the slave.
  1554.    * Save all evidence before reseting the replication. If we have no
  1555.      or only sketchy information, it would take us a while to track
  1556.      down the problem. The evidence you should collect is:
  1557.         * All binary logs on the master
  1558.         * All binary log on the slave
  1559.         * The output of `SHOW MASTER STATUS' on the master at the time
  1560.           you have discovered the problem
  1561.         * The output of `SHOW SLAVE STATUS' on the master at the time
  1562.           you have discovered the problem
  1563.         * Error logs on the master and on the slave
  1564.    * Use `mysqlbinlog' to examine the binary logs. The following should
  1565.      be helpful to find the trouble query, for example:
  1566.           mysqlbinlog -j pos_from_slave_status /path/to/log_from_slave_status | head
  1567. Once you have collected the evidence on the phantom problem, try hard to
  1568. isolate it into a separate test case first. Then report the problem to
  1569. <bugs@lists.mysql.com> with as much info as possible.
  1570. Getting Maximum Performance from MySQL
  1571. **************************************
  1572. Optimization is a complicated task because it ultimately requires
  1573. understanding of the whole system. While it may be possible to do some
  1574. local optimizations with small knowledge of your system/application, the
  1575. more optimal you want your system to become the more you will have to
  1576. know about it.
  1577. So this chapter will try to explain and give some examples of different
  1578. ways to optimize *MySQL*. But remember that there are always some
  1579. (increasingly harder) additional ways to make the system even faster.
  1580. Optimization Overview
  1581. =====================
  1582. The most important part for getting a system fast is of course the basic
  1583. design. You also need to know what kinds of things your system will be
  1584. doing, and what your bottlenecks are.
  1585. The most common bottlenecks are:
  1586.    * Disk seeks.  It takes time for the disk to find a piece of data.
  1587.      With modern disks in 1999, the mean time for this is usually lower
  1588.      than 10ms, so we can in theory do about 1000 seeks a second. This
  1589.      time improves slowly with new disks and is very hard to optimize
  1590.      for a single table. The way to optimize this is to spread the data
  1591.      on more than one disk.
  1592.    * Disk reading/writing.  When the disk is at the correct position we
  1593.      need to read the data. With modern disks in 1999, one disk
  1594.      delivers something like 10-20Mb/s. This is easier to optimize than
  1595.      seeks because you can read in parallel from multiple disks.
  1596.    * CPU cycles.  When we have the data in main memory (or if it
  1597.      already were there) we need to process it to get to our result.
  1598.      Having small tables compared to the memory is the most common
  1599.      limiting factor. But then, with small tables speed is usually not
  1600.      the problem.
  1601.    * Memory bandwidth.  When the CPU needs more data than can fit in
  1602.      the CPU cache the main memory bandwidth becomes a bottleneck. This
  1603.      is an uncommon bottleneck for most systems, but one should be
  1604.      aware of it.
  1605. System/Compile Time and Startup Parameter Tuning
  1606. ================================================
  1607. We start with the system level things since some of these decisions have
  1608. to be made very early. In other cases a fast look at this part may
  1609. suffice because it not that important for the big gains. However, it is
  1610. always nice to have a feeling about how much one could gain by changing
  1611. things at this level.
  1612. The default OS to use is really important!  To get the most use of
  1613. multiple CPU machines one should use Solaris (because the threads works
  1614. really nice) or Linux (because the 2.2 kernel has really good SMP
  1615. support). Also on 32-bit machines Linux has a 2G file size limit by
  1616. default. Hopefully this will be fixed soon when new filesystems are
  1617. released (XFS/Reiserfs).  If you have a desperate need for files bigger
  1618. than 2G on Linux-intel 32 bit, you should get the LFS patch for the ext2
  1619. file system.
  1620. Because we have not run *MySQL* in production on that many platforms, we
  1621. advice you to test your intended platform before choosing it, if
  1622. possible.
  1623. Other tips:
  1624.    * If you have enough RAM, you could remove all swap devices. Some
  1625.      operating systems will use a swap device in some contexts even if
  1626.      you have free memory.
  1627.    * Use the `--skip-locking' *MySQL* option to avoid external locking.
  1628.      Note that this will not impact *MySQL*'s functionality as long as
  1629.      you only run one server. Just remember to take down the server (or
  1630.      lock relevant parts) before you run `myisamchk'. On some system
  1631.      this switch is mandatory because the external locking does not
  1632.      work in any case.
  1633.      The `--skip-locking' option is on by default when compiling with
  1634.      MIT-pthreads, because `flock()' isn't fully supported by
  1635.      MIT-pthreads on all platforms.  It's also on default for Linux as
  1636.      Linux file locking are not yet safe.
  1637.      The only case when you can't use `--skip-locking' is if you run
  1638.      multiple *MySQL* _servers_ (not clients) on the same data, or run
  1639.      `myisamchk' on the table without first flushing and locking the
  1640.      `mysqld' server tables first.
  1641.      You can still use `LOCK TABLES'/`UNLOCK TABLES' even if you are
  1642.      using `--skip-locking'
  1643. How Compiling and Linking Affects the Speed of MySQL
  1644. ----------------------------------------------------
  1645. Most of the following tests are done on Linux with the *MySQL*
  1646. benchmarks, but they should give some indication for other operating
  1647. systems and workloads.
  1648. You get the fastest executable when you link with `-static'.
  1649. On Linux, you will get the fastest code when compiling with `pgcc' and
  1650. `-O6'. To compile `sql_yacc.cc' with these options, you need about 200M
  1651. memory because `gcc/pgcc' needs a lot of memory to make all functions
  1652. inline. You should also set `CXX=gcc' when configuring *MySQL* to avoid
  1653. inclusion of the `libstdc++' library (it is not needed). Note that with
  1654. some versions of `pgcc', the resulting code will only run on true
  1655. Pentium processors, even if you use the compiler option that you want
  1656. the resulting code to be working on all x586 type processors (like AMD).
  1657. By just using a better compiler and/or better compiler options you can
  1658. get a 10-30 % speed increase in your application.  This is particularly
  1659. important if you compile the SQL server yourself!
  1660. We have tested both the Cygnus CodeFusion and Fujitsu compilers, but
  1661. when we tested them, neither was sufficiently bug free to allow *MySQL*
  1662. to be compiled with optimizations on.
  1663. When you compile *MySQL* you should only include support for the
  1664. character sets that you are going to use. (Option `--with-charset=xxx').
  1665. The standard *MySQL* binary distributions are compiled with support for
  1666. all character sets.
  1667. Here is a list of some mesurements that we have done:
  1668.    * If you use `pgcc' and compile everything with `-O6', the `mysqld'
  1669.      server is 1% faster than with `gcc' 2.95.2.
  1670.    * If you link dynamically (without `-static'), the result is 13%
  1671.      slower on Linux.  Note that you still can use a dynamic linked
  1672.      *MySQL* library. It is only the server that is critical for
  1673.      performance.
  1674.    * If you connect using TCP/IP rather than Unix sockets, the result
  1675.      is 7.5% slower on the same computer. (If you are connection to
  1676.      `localhost', *MySQL* will, by default, use sockets).
  1677.    * If you compile with `--with-debug=full', then you will loose 20 %
  1678.      for most queries, but some queries may take substantially longer
  1679.      (The *MySQL* benchmarks ran 35 % slower) If you use
  1680.      `--with-debug', then you will only loose 15 %.
  1681.    * On a Sun SPARCstation 20, SunPro C++ 4.2 is 5 % faster than `gcc'
  1682.      2.95.2.
  1683.    * Compiling with `gcc' 2.95.2 for ultrasparc with the option
  1684.      `-mcpu=v8 -Wa,-xarch=v8plusa' gives 4 % more performance.
  1685.    * On Solaris 2.5.1, MIT-pthreads is 8-12% slower than Solaris native
  1686.      threads on a single processor. With more load/CPUs the difference
  1687.      should get bigger.
  1688.    * Running with `--log-bin' makes *[MySQL* 1 % slower.
  1689.    * Compiling without frame pointers `-fomit-frame-pointer' with gcc
  1690.      makes MySQL 1 % faster.
  1691. The *MySQL*-Linux distribution provided by MySQL AB used to be compiled
  1692. with `pgcc', but we had to go back to regular gcc because of a bug in
  1693. `pgcc' that would generate the code that does not run on AMD. We will
  1694. continue using gcc until that bug is resolved.  In the meantime, if you
  1695. have a non-AMD machine, you can get a faster binary by compiling with
  1696. `pgcc'.  The standard MySqL Linux binary is linked statically to get it
  1697. faster and more portable.
  1698. Disk Issues
  1699. -----------
  1700.    * As mentioned before, disks seeks are a big performance bottleneck.
  1701.      This problems gets more and more apparent when the data starts to
  1702.      grow so large that effective caching becomes impossible. For large
  1703.      databases, where you access data more or less randomly, you can be
  1704.      sure that you will need at least one disk seek to read and a
  1705.      couple of disk seeks to write things. To minimize this problem,
  1706.      use disks with low seek times.
  1707.    * Increase the number of available disk spindles (and thereby reduce
  1708.      the seek overhead) by either symlink files to different disks or
  1709.      striping the disks.
  1710.     *Using symbolic links*
  1711.           This means that you symlink the index and/or data file(s)
  1712.           from the normal data directory to another disk (that may also
  1713.           be striped). This makes both the seek and read times better
  1714.           (if the disks are not used for other things). *Note Symbolic
  1715.           links::.
  1716.     *Striping*
  1717.           Striping means that you have many disks and put the first
  1718.           block on the first disk, the second block on the second disk,
  1719.           and the Nth on the (N mod number_of_disks) disk, and so on.
  1720.           This means if your normal data size is less than the stripe
  1721.           size (or perfectly aligned) you will get much better
  1722.           performance. Note that striping is very dependent on the OS
  1723.           and stripe-size. So benchmark your application with different
  1724.           stripe-sizes. *Note Benchmarks::.
  1725.           Note that the speed difference for striping is *very*
  1726.           dependent on the parameters. Depending on how you set the
  1727.           striping parameters and number of disks you may get a
  1728.           difference in orders of magnitude. Note that you have to
  1729.           choose to optimize for random or sequential access.
  1730.    * For reliability you may want to use RAID 0+1 (striping +
  1731.      mirroring), but in this case you will need 2*N drives to hold N
  1732.      drives of data. This is probably the best option if you have the
  1733.      money for it!  You may, however, also have to invest in some
  1734.      volume-management software to handle it efficiently.
  1735.    * A good option is to have semi-important data (that can be
  1736.      regenerated) on RAID 0 disk while storing really important data
  1737.      (like host information and logs) on a RAID 0+1 or RAID N disk.
  1738.      RAID N can be a problem if you have many writes because of the
  1739.      time to update the parity bits.
  1740.    * You may also set the parameters for the file system that the
  1741.      database uses. One easy change is to mount the file system with
  1742.      the noatime option. That makes it skip the updating of the last
  1743.      access time in the inode and by this will avoid some disk seeks.
  1744.    * On Linux, you can get much more performance (up to 100 % under
  1745.      load is not uncommon) by using hdpram to configure your disk's
  1746.      interface!  The following should be quite good hdparm options for
  1747.      *MySQL* (and probably many other applications):
  1748.           hdparm -m 16 -d 1
  1749.      Note that the performance/reliability when using the above depends
  1750.      on your hardware, so we strongly suggest that you test your system
  1751.      throughly after using `hdparm'!  Please consult the `hdparm' man
  1752.      page for more information!  If `hdparm' is not used wisely,
  1753.      filesystem corruption may result.  Backup everything before
  1754.      experimenting!
  1755.    * On many operating systems you can mount the disks with the 'async'
  1756.      flag to set the file system to be updated asynchronously.  If your
  1757.      computer is reasonable stable, this should give you more
  1758.      performance without sacrificing too much reliability.  (This flag
  1759.      is on by default on Linux.)
  1760.    * If you don't need to know when a file was last accessed (which is
  1761.      not really useful on a databasa server), you can mount your file
  1762.      systems with the noatime flag.
  1763. Using Symbolic Links for Databases and Tables
  1764. .............................................
  1765. You can move tables and databases from the database directory to other
  1766. locations and replace them with symbolic links to the new locations.
  1767. You might want to do this, for example, to move a database to a file
  1768. system with more free space.
  1769. If *MySQL* notices that a table is symbolically linked, it will resolve
  1770. the symlink and use the table it points to instead. This works on all
  1771. systems that support the `realpath()' call (at least Linux and Solaris
  1772. support `realpath()')!  On systems that don't support `realpath()', you
  1773. should not access the table through the real path and through the
  1774. symlink at the same time!  If you do, the table will be inconsistent
  1775. after any update.
  1776. *MySQL* doesn't that you link one directory to multiple databases.
  1777. Replacing a database directory with a symbolic link will work fine as
  1778. long as you don't make a symbolic link between databases.  Suppose you
  1779. have a database `db1' under the *MySQL* data directory, and then make a
  1780. symlink `db2' that points to `db1':
  1781.      shell> cd /path/to/datadir
  1782.      shell> ln -s db1 db2
  1783. Now, for any table `tbl_a' in `db1', there also appears to be a table
  1784. `tbl_a' in `db2'.  If one thread updates `db1.tbl_a' and another thread
  1785. updates `db2.tbl_a', there will be problems.
  1786. If you really need this, you must change the following code in
  1787. `mysys/mf_format.c':
  1788.      if (flag & 32 || (!lstat(to,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
  1789. to
  1790.      if (1)
  1791. On Windows you can use internal symbolic links to directories by
  1792. compiling *MySQL* with `-DUSE_SYMDIR'. This allows you to put different
  1793. databases on different disks. *Note Windows symbolic links::.
  1794. Tuning Server Parameters
  1795. ------------------------
  1796. You can get the default buffer sizes used by the `mysqld' server with
  1797. this command:
  1798.      shell> mysqld --help
  1799. This command produces a list of all `mysqld' options and configurable
  1800. variables. The output includes the default values and looks something
  1801. like this:
  1802.      Possible variables for option --set-variable (-O) are:
  1803.      back_log              current value: 5
  1804.      bdb_cache_size        current value: 1048540
  1805.      binlog_cache_size     current_value: 32768
  1806.      connect_timeout       current value: 5
  1807.      delayed_insert_timeout  current value: 300
  1808.      delayed_insert_limit  current value: 100
  1809.      delayed_queue_size    current value: 1000
  1810.      flush_time            current value: 0
  1811.      interactive_timeout   current value: 28800
  1812.      join_buffer_size      current value: 131072
  1813.      key_buffer_size       current value: 1048540
  1814.      lower_case_table_names  current value: 0
  1815.      long_query_time       current value: 10
  1816.      max_allowed_packet    current value: 1048576
  1817.      max_binlog_cache_size current_value: 4294967295
  1818.      max_connections       current value: 100
  1819.      max_connect_errors    current value: 10
  1820.      max_delayed_threads   current value: 20
  1821.      max_heap_table_size   current value: 16777216
  1822.      max_join_size         current value: 4294967295
  1823.      max_sort_length       current value: 1024
  1824.      max_tmp_tables        current value: 32
  1825.      max_write_lock_count  current value: 4294967295
  1826.      myisam_sort_buffer_size  current value: 8388608
  1827.      net_buffer_length     current value: 16384
  1828.      net_retry_count       current value: 10
  1829.      net_read_timeout      current value: 30
  1830.      net_write_timeout     current value: 60
  1831.      query_buffer_size     current value: 0
  1832.      record_buffer         current value: 131072
  1833.      slow_launch_time      current value: 2
  1834.      sort_buffer           current value: 2097116
  1835.      table_cache           current value: 64
  1836.      thread_concurrency    current value: 10
  1837.      tmp_table_size        current value: 1048576
  1838.      thread_stack          current value: 131072
  1839.      wait_timeout          current value: 28800
  1840. If there is a `mysqld' server currently running, you can see what
  1841. values it actually is using for the variables by executing this command:
  1842.      shell> mysqladmin variables
  1843. You can find a full description for all variables in the `SHOW
  1844. VARIABLES' section in this manual. *Note SHOW VARIABLES::.
  1845. You can also see some statistics from a running server by issuing the
  1846. command `SHOW STATUS'. *Note SHOW STATUS::.
  1847. *MySQL* uses algorithms that are very scalable, so you can usually run
  1848. with very little memory. If you, however, give *MySQL* more memory, you
  1849. will normally also get better performance.
  1850. When tuning a *MySQL* server, the two most important variables to use
  1851. are `key_buffer_size' and `table_cache'.  You should first feel
  1852. confident that you have these right before trying to change any of the
  1853. other variables.
  1854. If you have much memory (>=256M) and many tables and want maximum
  1855. performance with a moderate number of clients, you should use something
  1856. like this:
  1857.      shell> safe_mysqld -O key_buffer=64M -O table_cache=256 
  1858.                 -O sort_buffer=4M -O record_buffer=1M &
  1859. If you have only 128M and only a few tables, but you still do a lot of
  1860. sorting, you can use something like:
  1861.      shell> safe_mysqld -O key_buffer=16M -O sort_buffer=1M
  1862. If you have little memory and lots of connections, use something like
  1863. this:
  1864.      shell> safe_mysqld -O key_buffer=512k -O sort_buffer=100k 
  1865.                 -O record_buffer=100k &
  1866. or even:
  1867.      shell> safe_mysqld -O key_buffer=512k -O sort_buffer=16k 
  1868.                 -O table_cache=32 -O record_buffer=8k -O net_buffer=1K &
  1869. When you have installed *MySQL*, the `support-files' directory will
  1870. contain some different `my.cnf' example files, `my-huge.cnf',
  1871. `my-large.cnf', `my-medium.cnf', and `my-small.cnf', you can use as a
  1872. base to optimize your system.
  1873. If there are very many connections, "swapping problems" may occur unless
  1874. `mysqld' has been configured to use very little memory for each
  1875. connection. `mysqld' performs better if you have enough memory for all
  1876. connections, of course.
  1877. Note that if you change an option to `mysqld', it remains in effect only
  1878. for that instance of the server.
  1879. To see the effects of a parameter change, do something like this:
  1880.      shell> mysqld -O key_buffer=32m --help
  1881. Make sure that the `--help' option is last; otherwise, the effect of any
  1882. options listed after it on the command line will not be reflected in the
  1883. output.
  1884. How MySQL Opens and Closes Tables
  1885. ---------------------------------
  1886. `table_cache', `max_connections', and `max_tmp_tables' affect the
  1887. maximum number of files the server keeps open.  If you increase one or
  1888. both of these values, you may run up against a limit imposed by your
  1889. operating system on the per-process number of open file descriptors.
  1890. However, you can increase the limit on many systems.  Consult your OS
  1891. documentation to find out how to do this, because the method for
  1892. changing the limit varies widely from system to system.
  1893. `table_cache' is related to `max_connections'.  For example, for 200
  1894. concurrent running connections, you should have a table cache of at
  1895. least `200 * n', where `n' is the maximum number of tables in a join.
  1896. The cache of open tables can grow to a maximum of `table_cache'
  1897. (default 64; this can be changed with the `-O table_cache=#' option to
  1898. `mysqld').  A table is never closed, except when the cache is full and
  1899. another thread tries to open a table or if you use `mysqladmin refresh'
  1900. or `mysqladmin flush-tables'.
  1901. When the table cache fills up, the server uses the following procedure
  1902. to locate a cache entry to use:
  1903.    * Tables that are not currently in use are released, in
  1904.      least-recently-used order.
  1905.    * If the cache is full and no tables can be released, but a new
  1906.      table needs to be opened, the cache is temporarily extended as
  1907.      necessary.
  1908.    * If the cache is in a temporarily-extended state and a table goes
  1909.      from in-use to not-in-use state, the table is closed and released
  1910.      from the cache.
  1911. A table is opened for each concurrent access. This means that if you
  1912. have two threads accessing the same table or access the table twice in
  1913. the same query (with `AS') the table needs to be opened twice.  The
  1914. first open of any table takes two file descriptors; each additional use
  1915. of the table takes only one file descriptor.  The extra descriptor for
  1916. the first open is used for the index file; this descriptor is shared
  1917. among all threads.
  1918. You can check if your table cache is too small by checking the mysqld
  1919. variable `opened_tables'.  If this is quite big, even if you haven't
  1920. done a lot of `FLUSH TABLES', you should increase your table cache.
  1921. *Note SHOW STATUS::.
  1922. Drawbacks to Creating Large Numbers of Tables in the Same Database
  1923. ------------------------------------------------------------------
  1924. If you have many files in a directory, open, close, and create
  1925. operations will be slow.  If you execute `SELECT' statements on many
  1926. different tables, there will be a little overhead when the table cache
  1927. is full, because for every table that has to be opened, another must be
  1928. closed. You can reduce this overhead by making the table cache larger.
  1929. Why So Many Open tables?
  1930. ------------------------
  1931. When you run `mysqladmin status', you'll see something like this:
  1932.      Uptime: 426 Running threads: 1 Questions: 11082 Reloads: 1 Open tables: 12
  1933. This can be somewhat perplexing if you only have 6 tables.
  1934. *MySQL* is multithreaded, so it may have many queries on the same table
  1935. simultaneously. To minimize the problem with two threads having
  1936. different states on the same file, the table is opened independently by
  1937. each concurrent thread. This takes some memory and one extra file
  1938. descriptor for the data file. The index file descriptor is shared
  1939. between all threads.
  1940. How MySQL Uses Memory
  1941. ---------------------
  1942. The list below indicates some of the ways that the `mysqld' server uses
  1943. memory.  Where applicable, the name of the server variable relevant to
  1944. the memory use is given:
  1945.    * The key buffer (variable `key_buffer_size') is shared by all
  1946.      threads; Other buffers used by the server are allocated as needed.
  1947.      *Note Server parameters::.
  1948.    * Each connection uses some thread-specific space: A stack (default
  1949.      64K, variable `thread_stack'), a connection buffer (variable
  1950.      `net_buffer_length'), and a result buffer (variable
  1951.      `net_buffer_length'). The connection buffer and result buffer are
  1952.      dynamically enlarged up to `max_allowed_packet' when needed.  When
  1953.      a query is running, a copy of the current query string is also
  1954.      allocated.
  1955.    * All threads share the same base memory.
  1956.    * Only the compressed ISAM / MyISAM tables are memory mapped.  This
  1957.      is because the 32-bit memory space of 4GB is not large enough for
  1958.      most big tables. When systems with a 64-bit address space become
  1959.      more common we may add general support for memory mapping.
  1960.    * Each request doing a sequential scan over a table allocates a read
  1961.      buffer (variable `record_buffer').
  1962.    * All joins are done in one pass, and most joins can be done without
  1963.      even using a temporary table. Most temporary tables are
  1964.      memory-based (HEAP) tables.  Temporary tables with a big record
  1965.      length (calculated as the sum of all column lengths) or that
  1966.      contain `BLOB' columns are stored on disk.
  1967.      One problem in *MySQL* versions before Version 3.23.2 is that if a
  1968.      HEAP table exceeds the size of `tmp_table_size', you get the error
  1969.      `The table tbl_name is full'. In newer versions this is handled by
  1970.      automatically changing the in-memory (HEAP) table to a disk-based
  1971.      (MyISAM) table as necessary. To work around this problem, you can
  1972.      increase the temporary table size by setting the `tmp_table_size'
  1973.      option to `mysqld', or by setting the SQL option `SQL_BIG_TABLES'
  1974.      in the client program.  *Note `SET OPTION': SET OPTION. In *MySQL*
  1975.      Version 3.20, the maximum size of the temporary table was
  1976.      `record_buffer*16', so if you are using this version, you have to
  1977.      increase the value of `record_buffer'. You can also start `mysqld'
  1978.      with the `--big-tables' option to always store temporary tables on
  1979.      disk. However, this will affect the speed of many complicated
  1980.      queries.
  1981.    * Most requests doing a sort allocates a sort buffer and 0-2
  1982.      temporary files depending on the result set size. *Note Temporary
  1983.      files::.
  1984.    * Almost all parsing and calculating is done in a local memory
  1985.      store. No memory overhead is needed for small items and the normal
  1986.      slow memory allocation and freeing is avoided. Memory is allocated
  1987.      only for unexpectedly large strings (this is done with `malloc()'
  1988.      and `free()').
  1989.    * Each index file is opened once and the data file is opened once
  1990.      for each concurrently running thread. For each concurrent thread,
  1991.      a table structure, column structures for each column, and a buffer
  1992.      of size `3 * n' is allocated (where `n' is the maximum row length,
  1993.      not counting `BLOB' columns). A `BLOB' uses 5 to 8 bytes plus the
  1994.      length of the `BLOB' data. The `ISAM'/`MyISAM' table handlers will
  1995.      use one extra row buffer for internal usage.
  1996.    * For each table having `BLOB' columns, a buffer is enlarged
  1997.      dynamically to read in larger `BLOB' values. If you scan a table,
  1998.      a buffer as large as the largest `BLOB' value is allocated.
  1999.    * Table handlers for all in-use tables are saved in a cache and
  2000.      managed as a FIFO. Normally the cache has 64 entries. If a table
  2001.      has been used by two running threads at the same time, the cache
  2002.      contains two entries for the table. *Note Table cache::.
  2003.    * A `mysqladmin flush-tables' command closes all tables that are not
  2004.      in use and marks all in-use tables to be closed when the currently
  2005.      executing thread finishes. This will effectively free most in-use
  2006.      memory.
  2007. `ps' and other system status programs may report that `mysqld' uses a
  2008. lot of memory. This may be caused by thread-stacks on different memory
  2009. addresses. For example, the Solaris version of `ps' counts the unused
  2010. memory between stacks as used memory. You can verify this by checking
  2011. available swap with `swap -s'. We have tested `mysqld' with commercial
  2012. memory-leakage detectors, so there should be no memory leaks.
  2013. How MySQL Locks Tables
  2014. ----------------------
  2015. You can find a discussion about different locking methods in the
  2016. appendix.  *Note Locking methods::.
  2017. All locking in *MySQL* is deadlock-free.  This is managed by always
  2018. requesting all needed locks at once at the beginning of a query and
  2019. always locking the tables in the same order.
  2020. The locking method *MySQL* uses for `WRITE' locks works as follows:
  2021.    * If there are no locks on the table, put a write lock on it.
  2022.    * Otherwise, put the lock request in the write lock queue.
  2023. The locking method *MySQL* uses for `READ' locks works as follows:
  2024.    * If there are no write locks on the table, put a read lock on it.
  2025.    * Otherwise, put the lock request in the read lock queue.
  2026. When a lock is released, the lock is made available to the threads in
  2027. the write lock queue, then to the threads in the read lock queue.
  2028. This means that if you have many updates on a table, `SELECT'
  2029. statements will wait until there are no more updates.
  2030. To work around this for the case where you want to do many `INSERT' and
  2031. `SELECT' operations on a table, you can insert rows in a temporary
  2032. table and update the real table with the records from the temporary
  2033. table once in a while.
  2034. This can be done with the following code:
  2035.      mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
  2036.      mysql> insert into real_table select * from insert_table;
  2037.      mysql> TRUNCATE TABLE insert_table;
  2038.      mysql> UNLOCK TABLES;
  2039. You can use the `LOW_PRIORITY' options with `INSERT' if you want to
  2040. prioritize retrieval in some specific cases.  *Note `INSERT': INSERT.
  2041. You could also change the locking code in `mysys/thr_lock.c' to use a
  2042. single queue.  In this case, write locks and read locks would have the
  2043. same priority, which might help some applications.
  2044. Table Locking Issues
  2045. --------------------
  2046. The table locking code in *MySQL* is deadlock free.
  2047. *MySQL* uses table locking (instead of row locking or column locking)
  2048. on all table types, except `BDB' tables, to achieve a very high lock
  2049. speed.  For large tables, table locking is MUCH better than row locking
  2050. for most applications, but there are, of course, some pitfalls.
  2051. For `BDB' tables, *MySQL* only uses table locking if you explicitely
  2052. lock the table with `LOCK TABLES' or execute a command that will modify
  2053. every row in the table, like `ALTER TABLE'.
  2054. In *MySQL* Version 3.23.7 and above, you can insert rows into `MyISAM'
  2055. tables at the same time other threads are reading from the table.  Note
  2056. that currently this only works if there are no holes after deleted rows
  2057. in the table at the time the insert is made.
  2058. Table locking enables many threads to read from a table at the same
  2059. time, but if a thread wants to write to a table, it must first get
  2060. exclusive access.  During the update, all other threads that want to
  2061. access this particular table will wait until the update is ready.
  2062. As updates on tables normally are considered to be more important than
  2063. `SELECT', all statements that update a table have higher priority than
  2064. statements that retrieve information from a table. This should ensure
  2065. that updates are not 'starved' because one issues a lot of heavy
  2066. queries against a specific table. (You can change this by using
  2067. LOW_PRIORITY with the statement that does the update or `HIGH_PRIORITY'
  2068. with the `SELECT' statement.)
  2069. Starting from *MySQL* Version 3.23.7 one can use the
  2070. `max_write_lock_count' variable to force *MySQL* to temporary give all
  2071. `SELECT' statements, that wait for a table, a higher priority after a
  2072. specific number of inserts on a table.
  2073. Table locking is, however, not very good under the following senario:
  2074.    * A client issues a `SELECT' that takes a long time to run.
  2075.    * Another client then issues an `UPDATE' on a used table. This client
  2076.      will wait until the `SELECT' is finished.
  2077.    * Another client issues another `SELECT' statement on the same
  2078.      table. As `UPDATE' has higher priority than `SELECT', this `SELECT'
  2079.      will wait for the `UPDATE' to finish.  It will also wait for the
  2080.      first `SELECT' to finish!
  2081.    * A thread is waiting for something like `full disk', in which case
  2082.      all threads that wants to access the problem table will also be
  2083.      put in a waiting state until more disk space is made available.
  2084. Some possible solutions to this problem are:
  2085.    * Try to get the `SELECT' statements to run faster. You may have to
  2086.      create some summary tables to do this.
  2087.    * Start `mysqld' with `--low-priority-updates'.  This will give all
  2088.      statements that update (modify) a table lower priority than a
  2089.      `SELECT' statement. In this case the last `SELECT' statement in
  2090.      the previous scenario would execute before the `INSERT' statement.
  2091.    * You can give a specific `INSERT', `UPDATE', or `DELETE' statement
  2092.      lower priority with the `LOW_PRIORITY' attribute.
  2093.    * Start `mysqld' with a low value for *max_write_lock_count* to give
  2094.      `READ' locks after a certain number of `WRITE' locks.
  2095.    * You can specify that all updates from a specific thread should be
  2096.      done with low priority by using the SQL command: `SET
  2097.      SQL_LOW_PRIORITY_UPDATES=1'.  *Note `SET OPTION': SET OPTION.
  2098.    * You can specify that a specific `SELECT' is very important with the
  2099.      `HIGH_PRIORITY' attribute. *Note `SELECT': SELECT.
  2100.    * If you have problems with `INSERT' combined with `SELECT', switch
  2101.      to use the new `MyISAM' tables as these support concurrent
  2102.      `SELECT's and `INSERT's.
  2103.    * If you mainly mix `INSERT' and `SELECT' statements, the `DELAYED'
  2104.      attribute to `INSERT' will probably solve your problems.  *Note
  2105.      `INSERT': INSERT.
  2106.    * If you have problems with `SELECT' and `DELETE', the `LIMIT'
  2107.      option to `DELETE' may help. *Note `DELETE': DELETE.
  2108. How MySQL uses DNS
  2109. ------------------
  2110. When a new threads connects to `mysqld', `mysqld' will span a new
  2111. thread to handle the request.  This thread will first check if the
  2112. hostname is in the hostname cache. If not the thread will call
  2113. `gethostbyaddr_r()' and `gethostbyname_r()' to resolve the hostname.
  2114. If the operating system doesn't support the above thread-safe calls, the
  2115. thread will lock a mutex and call `gethostbyaddr()' and
  2116. `gethostbyname()' instead. Note that in this case no other thread can
  2117. resolve other hostnames that is not in the hostname cache until the
  2118. first thread is ready.
  2119. You can disable DNS host lookup by starting `mysqld' with
  2120. `--skip-name-resolve'.  In this case you can however only use IP names
  2121. in the *MySQL* privilege tables.
  2122. If you have a very slow DNS and many hosts, you can get more
  2123. performance by either disabling DNS lookop with `--skip-name-resolve'
  2124. or by increasing the `HOST_CACHE_SIZE' define (default: 128) and
  2125. recompile `mysqld'.
  2126. You can disable the hostname cache with `--skip-host-cache'. You can
  2127. clear the hostname cache with `FLUSH HOSTS' or `mysqladmin flush-hosts'.
  2128. If you don't want to allow connections over `TCP/IP', you can do this
  2129. by starting mysqld with `--skip-networking'.
  2130. Get Your Data as Small as Possible
  2131. ==================================
  2132. One of the most basic optimization is to get your data (and indexes) to
  2133. take as little space on the disk (and in memory) as possible. This can
  2134. give huge improvements because disk reads are faster and normally less
  2135. main memory will be used. Indexing also takes less resources if done on
  2136. smaller columns.
  2137. *MySQL* supports a lot of different table types and row formats.
  2138. Choosing the right table format may give you a big performance gain.
  2139. *Note Table types::.
  2140. You can get better performance on a table and minimize storage space
  2141. using the techniques listed below:
  2142.    * Use the most efficient (smallest) types possible. *MySQL* has many
  2143.      specialized types that save disk space and memory.
  2144.    * Use the smaller integer types if possible to get smaller tables.
  2145.      For example, `MEDIUMINT' is often better than `INT'.
  2146.    * Declare columns to be `NOT NULL' if possible. It makes everything
  2147.      faster and you save one bit per column. Note that if you really
  2148.      need `NULL' in your application you should definitely use it. Just
  2149.      avoid having it on all columns by default.
  2150.    * If you don't have any variable-length columns (`VARCHAR', `TEXT',
  2151.      or `BLOB' columns), a fixed-size record format is used. This is
  2152.      faster but unfortunately may waste some space.  *Note MyISAM table
  2153.      formats::.
  2154.    * The primary index of a table should be as short as possible. This
  2155.      makes identification of one row easy and efficient.
  2156.    * For each table, you have to decide which storage/index method to
  2157.      use. *Note Table types::.
  2158.    * Only create the indexes that you really need. Indexes are good for
  2159.      retrieval but bad when you need to store things fast. If you mostly
  2160.      access a table by searching on a combination of columns, make an
  2161.      index on them. The first index part should be the most used
  2162.      column. If you are ALWAYS using many columns, you should use the
  2163.      column with more duplicates first to get better compression of the
  2164.      index.
  2165.    * If it's very likely that a column has a unique prefix on the first
  2166.      number of characters, it's better to only index this prefix.
  2167.      *MySQL* supports an index on a part of a character column. Shorter
  2168.      indexes are faster not only because they take less disk space but
  2169.      also because they will give you more hits in the index cache and
  2170.      thus fewer disk seeks. *Note Server parameters::.
  2171.    * In some circumstances it can be beneficial to split into two a
  2172.      table that is scanned very often. This is especially true if it is
  2173.      a dynamic format table and it is possible to use a smaller static
  2174.      format table that can be used to find the relevant rows when
  2175.      scanning the table.
  2176. How MySQL Uses Indexes
  2177. ======================
  2178. Indexes are used to find rows with a specific value of one column fast.
  2179. Without an index *MySQL* has to start with the first record and then
  2180. read through the whole table until it finds the relevant rows. The
  2181. bigger the table, the more this costs. If the table has an index for
  2182. the colums in question, *MySQL* can quickly get a position to seek to
  2183. in the middle of the data file without having to look at all the data.
  2184. If a table has 1000 rows, this is at least 100 times faster than
  2185. reading sequentially. Note that if you need to access almost all 1000
  2186. rows it is faster to read sequentially because we then avoid disk seeks.
  2187. All *MySQL* indexes (`PRIMARY', `UNIQUE', and `INDEX') are stored in
  2188. B-trees. Strings are automatically prefix- and end-space compressed.
  2189. *Note `CREATE INDEX': CREATE INDEX.
  2190. Indexes are used to:
  2191.    * Quickly find the rows that match a `WHERE' clause.
  2192.    * Retrieve rows from other tables when performing joins.
  2193.    * Find the `MAX()' or `MIN()' value for a specific indexed column.
  2194.      This is optimized by a preprocessor that checks if you are using
  2195.      `WHERE' key_part_# = constant on all key parts < N.  In this case
  2196.      *MySQL* will do a single key lookup and replace the `MIN()'
  2197.      expression with a constant.  If all expressions are replaced with
  2198.      constants, the query will return at once:
  2199.           SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
  2200.    * Sort or group a table if the sorting or grouping is done on a
  2201.      leftmost prefix of a usable key (for example, `ORDER BY
  2202.      key_part_1,key_part_2 '). The key is read in reverse order if all
  2203.      key parts are followed by `DESC'.
  2204.      The index can also be used even if the `ORDER BY' doesn't match
  2205.      the index exactly, as long as all the unused index parts and all
  2206.      the extra are `ORDER BY' columns are constants in the `WHERE'
  2207.      clause. The following queries will use the index to resolve the
  2208.      `ORDER BY' part:
  2209.           SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3;
  2210.           SELECT * FROM foo WHERE column=constant ORDER BY column, key_part1;
  2211.           SELECT * FROM foo WHERE key_part1=const GROUP BY key_part2;
  2212.    * In some cases a query can be optimized to retrieve values without
  2213.      consulting the data file. If all used columns for some table are
  2214.      numeric and form a leftmost prefix for some key, the values may be
  2215.      retrieved from the index tree for greater speed:
  2216.           SELECT key_part3 FROM table_name WHERE key_part1=1
  2217. Suppose you issue the following `SELECT' statement:
  2218.      mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
  2219. If a multiple-column index exists on `col1' and `col2', the appropriate
  2220. rows can be fetched directly. If separate single-column indexes exist
  2221. on `col1' and `col2', the optimizer tries to find the most restrictive
  2222. index by deciding which index will find fewer rows and using that index
  2223. to fetch the rows.
  2224. If the table has a multiple-column index, any leftmost prefix of the
  2225. index can be used by the optimizer to find rows. For example, if you
  2226. have a three-column index on `(col1,col2,col3)', you have indexed
  2227. search capabilities on `(col1)', `(col1,col2)', and `(col1,col2,col3)'.
  2228. *MySQL* can't use a partial index if the columns don't form a leftmost
  2229. prefix of the index.  Suppose you have the `SELECT' statements shown
  2230. below:
  2231.      mysql> SELECT * FROM tbl_name WHERE col1=val1;
  2232.      mysql> SELECT * FROM tbl_name WHERE col2=val2;
  2233.      mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
  2234. If an index exists on `(col1,col2,col3)', only the first query shown
  2235. above uses the index. The second and third queries do involve indexed
  2236. columns, but `(col2)' and `(col2,col3)' are not leftmost prefixes of
  2237. `(col1,col2,col3)'.
  2238. *MySQL* also uses indexes for `LIKE' comparisons if the argument to
  2239. `LIKE' is a constant string that doesn't start with a wild-card
  2240. character.  For example, the following `SELECT' statements use indexes:
  2241.      mysql> select * from tbl_name where key_col LIKE "Patrick%";
  2242.      mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";
  2243. In the first statement, only rows with `"Patrick" <= key_col <
  2244. "Patricl"' are considered.  In the second statement, only rows with
  2245. `"Pat" <= key_col < "Pau"' are considered.
  2246. The following `SELECT' statements will not use indexes:
  2247.      mysql> select * from tbl_name where key_col LIKE "%Patrick%";
  2248.      mysql> select * from tbl_name where key_col LIKE other_col;
  2249. In the first statement, the `LIKE' value begins with a wild-card
  2250. character.  In the second statement, the `LIKE' value is not a constant.
  2251. Searching using `column_name IS NULL' will use indexes if column_name
  2252. is an index.
  2253. *MySQL* normally uses the index that finds the least number of rows. An
  2254. index is used for columns that you compare with the following operators:
  2255. `=', `>', `>=', `<', `<=', `BETWEEN', and a `LIKE' with a non-wild-card
  2256. prefix like `'something%''.