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

MySQL数据库

开发平台:

Visual C++

  1. |                      0 |
  2. +------------------------+
  3. 1 row in set (0.32 sec)
  4. @end example
  5. The above shows that @strong{MySQL} can execute 1,000,000 @code{+}
  6. expressions in 0.32 seconds on a @code{PentiumII 400MHz}.
  7. All @strong{MySQL} functions should be very optimized, but there may be
  8. some exceptions, and the @code{benchmark(loop_count,expression)} is a
  9. great tool to find out if this is a problem with your query.
  10. @menu
  11. * Estimating performance::      Estimating query performance
  12. * SELECT speed::                Speed of @code{SELECT} queries
  13. * Where optimizations::         How MySQL optimizes @code{WHERE} clauses
  14. * DISTINCT optimization::       How MySQL Optimizes @code{DISTINCT}
  15. * LEFT JOIN optimization::      How MySQL optimizes @code{LEFT JOIN}
  16. * LIMIT optimization::          How MySQL optimizes @code{LIMIT}
  17. * Insert speed::                Speed of @code{INSERT} queries
  18. * Update speed::                Speed of @code{UPDATE} queries
  19. * Delete speed::                Speed of @code{DELETE} queries
  20. @end menu
  21. @cindex estimating, query performance
  22. @cindex queries, estimating performance
  23. @cindex performance, estimating
  24. @node Estimating performance, SELECT speed, Query Speed, Query Speed
  25. @subsection Estimating Query Performance
  26. In most cases you can estimate the performance by counting disk seeks.
  27. For small tables, you can usually find the row in 1 disk seek (as the
  28. index is probably cached).  For bigger tables, you can estimate that
  29. (using B++ tree indexes) you will need: @code{log(row_count) /
  30. log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) +
  31. 1} seeks to find a row.
  32. In @strong{MySQL} an index block is usually 1024 bytes and the data
  33. pointer is usually 4 bytes. A 500,000 row table with an
  34. index length of 3 (medium integer) gives you:
  35. @code{log(500,000)/log(1024/3*2/(3+4)) + 1} = 4 seeks.
  36. As the above index would require about 500,000 * 7 * 3/2 = 5.2M,
  37. (assuming that the index buffers are filled to 2/3, which is typical)
  38. you will probably have much of the index in memory and you will probably
  39. only need 1-2 calls to read data from the OS to find the row.
  40. For writes, however, you will need 4 seek requests (as above) to find
  41. where to place the new index and normally 2 seeks to update the index
  42. and write the row.
  43. Note that the above doesn't mean that your application will slowly
  44. degenerate by N log N!  As long as everything is cached by the OS or SQL
  45. server things will only go marginally slower while the table gets
  46. bigger. After the data gets too big to be cached, things will start to
  47. go much slower until your applications is only bound by disk-seeks
  48. (which increase by N log N). To avoid this, increase the index cache as
  49. the data grows. @xref{Server parameters}.
  50. @cindex speed, of queries
  51. @findex SELECT speed
  52. @node SELECT speed, Where optimizations, Estimating performance, Query Speed
  53. @subsection Speed of @code{SELECT} Queries
  54. In general, when you want to make a slow @code{SELECT ... WHERE} faster, the
  55. first thing to check is whether or not you can add an index. @xref{MySQL
  56. indexes, , @strong{MySQL} indexes}. All references between different tables
  57. should usually be done with indexes. You can use the @code{EXPLAIN} command
  58. to determine which indexes are used for a @code{SELECT}.
  59. @xref{EXPLAIN, , @code{EXPLAIN}}.
  60. Some general tips:
  61. @itemize @bullet
  62. @item
  63. To help @strong{MySQL} optimize queries better, run @code{myisamchk
  64. --analyze} on a table after it has been loaded with relevant data. This
  65. updates a value for each index part that indicates the average number of
  66. rows that have the same value.  (For unique indexes, this is always 1,
  67. of course.).  @strong{MySQL} will use this to decide which index to
  68. choose when you connect two tables with 'a non-constant expression'.
  69. You can check the result from the @code{analyze} run by doing @code{SHOW
  70. INDEX FROM table_name} and examining the @code{Cardinality} column.
  71. @item
  72. To sort an index and data according to an index, use @code{myisamchk
  73. --sort-index --sort-records=1} (if you want to sort on index 1). If you
  74. have a unique index from which you want to read all records in order
  75. according to that index, this is a good way to make that faster.  Note,
  76. however, that this sorting isn't written optimally and will take a long
  77. time for a large table!
  78. @end itemize
  79. @cindex optimizations
  80. @findex WHERE
  81. @node Where optimizations, DISTINCT optimization, SELECT speed, Query Speed
  82. @subsection How MySQL Optimizes @code{WHERE} Clauses
  83. The @code{WHERE} optimizations are put in the @code{SELECT} part here because
  84. they are mostly used with @code{SELECT}, but the same optimizations apply for
  85. @code{WHERE} in @code{DELETE} and @code{UPDATE} statements.
  86. Also note that this section is incomplete. @strong{MySQL} does many
  87. optimizations, and we have not had time to document them all.
  88. Some of the optimizations performed by @strong{MySQL} are listed below:
  89. @itemize @bullet
  90. @item
  91. Removal of unnecessary parentheses:
  92. @example
  93.    ((a AND b) AND c OR (((a AND b) AND (c AND d))))
  94. -> (a AND b AND c) OR (a AND b AND c AND d)
  95. @end example
  96. @item
  97. Constant folding:
  98. @example
  99.    (a<b AND b=c) AND a=5
  100. -> b>5 AND b=c AND a=5
  101. @end example
  102. @item
  103. Constant condition removal (needed because of constant folding):
  104. @example
  105.    (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
  106. -> B=5 OR B=6
  107. @end example
  108. @item
  109. Constant expressions used by indexes are evaluated only once.
  110. @item
  111. @code{COUNT(*)} on a single table without a @code{WHERE} is retrieved
  112. directly from the table information.  This is also done for any @code{NOT NULL}
  113. expression when used with only one table.
  114. @item
  115. Early detection of invalid constant expressions. @strong{MySQL} quickly
  116. detects that some @code{SELECT} statements are impossible and returns no rows.
  117. @item
  118. @code{HAVING} is merged with @code{WHERE} if you don't use @code{GROUP BY}
  119. or group functions (@code{COUNT()}, @code{MIN()}...).
  120. @item
  121. For each sub-join, a simpler @code{WHERE} is constructed to get a fast
  122. @code{WHERE} evaluation for each sub-join and also to skip records as
  123. soon as possible.
  124. @cindex constant table
  125. @cindex tables, constant
  126. @item
  127. All constant tables are read first, before any other tables in the query.
  128. A constant table is:
  129. @itemize @minus
  130. @item
  131. An empty table or a table with 1 row.
  132. @item
  133. A table that is used with a @code{WHERE} clause on a @code{UNIQUE}
  134. index, or a @code{PRIMARY KEY}, where all index parts are used with constant
  135. expressions and the index parts are defined as @code{NOT NULL}.
  136. @end itemize
  137. All the following tables are used as constant tables:
  138. @example
  139. mysql> SELECT * FROM t WHERE primary_key=1;
  140. mysql> SELECT * FROM t1,t2
  141.            WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
  142. @end example
  143. @item
  144. The best join combination to join the tables is found by trying all
  145. possibilities. If all columns in @code{ORDER BY} and in @code{GROUP
  146. BY} come from the same table, then this table is preferred first when
  147. joining.
  148. @item
  149. If there is an @code{ORDER BY} clause and a different @code{GROUP BY}
  150. clause, or if the @code{ORDER BY} or @code{GROUP BY} contains columns
  151. from tables other than the first table in the join queue, a temporary
  152. table is created.
  153. @item
  154. If you use @code{SQL_SMALL_RESULT}, @strong{MySQL} will use an in-memory
  155. temporary table.
  156. @item
  157. Each table index is queried, and the best index that spans fewer than 30% of
  158. the rows is used. If no such index can be found, a quick table scan is used.
  159. @item
  160. In some cases, @strong{MySQL} can read rows from the index without even
  161. consulting the data file.  If all columns used from the index are numeric,
  162. then only the index tree is used to resolve the query.
  163. @item
  164. Before each record is output, those that do not match the @code{HAVING} clause
  165. are skipped.
  166. @end itemize
  167. Some examples of queries that are very fast:
  168. @example
  169. mysql> SELECT COUNT(*) FROM tbl_name;
  170. mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
  171. mysql> SELECT MAX(key_part2) FROM tbl_name
  172.            WHERE key_part_1=constant;
  173. mysql> SELECT ... FROM tbl_name
  174.            ORDER BY key_part1,key_part2,... LIMIT 10;
  175. mysql> SELECT ... FROM tbl_name
  176.            ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;
  177. @end example
  178. The following queries are resolved using only the index tree (assuming
  179. the indexed columns are numeric):
  180. @example
  181. mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
  182. mysql> SELECT COUNT(*) FROM tbl_name
  183.            WHERE key_part1=val1 AND key_part2=val2;
  184. mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;
  185. @end example
  186. The following queries use indexing to retrieve the rows in sorted
  187. order without a separate sorting pass:
  188. @example
  189. mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
  190. mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...
  191. @end example
  192. @findex DISTINCT
  193. @cindex optimizing, DISTINCT
  194. @node DISTINCT optimization, LEFT JOIN optimization, Where optimizations, Query Speed
  195. @subsection How MySQL Optimizes @code{DISTINCT}
  196. @code{DISTINCT} is converted to a @code{GROUP BY} on all columns,
  197. @code{DISTINCT} combined with @code{ORDER BY} will in many cases also
  198. need a temporary table.
  199. When combining @code{LIMIT #} with @code{DISTINCT}, @strong{MySQL} will stop
  200. as soon as it finds @code{#} unique rows.
  201. If you don't use columns from all used tables, @strong{MySQL} will stop
  202. the scanning of the not used tables as soon as it has found the first match.
  203. @example
  204. SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
  205. @end example
  206. In the case, assuming t1 is used before t2 (check with @code{EXPLAIN}), then
  207. @strong{MySQL} will stop reading from t2 (for that particular row in t1)
  208. when the first row in t2 is found.
  209. @findex LEFT JOIN
  210. @cindex optimizing, LEFT JOIN
  211. @node LEFT JOIN optimization, LIMIT optimization, DISTINCT optimization, Query Speed
  212. @subsection How MySQL Optimizes @code{LEFT JOIN} and @code{RIGHT JOIN}
  213. @code{A LEFT JOIN B} in @strong{MySQL} is implemented as follows:
  214. @itemize @bullet
  215. @item
  216. The table @code{B} is set to be dependent on table @code{A} and all tables
  217. that @code{A} is dependent on.
  218. @item
  219. The table @code{A} is set to be dependent on all tables (except @code{B})
  220. that are used in the @code{LEFT JOIN} condition.
  221. @item
  222. All @code{LEFT JOIN} conditions are moved to the @code{WHERE} clause.
  223. @item
  224. All standard join optimizations are done, with the exception that a table is
  225. always read after all tables it is dependent on.  If there is a circular
  226. dependence then @strong{MySQL} will issue an error.
  227. @item
  228. All standard @code{WHERE} optimizations are done.
  229. @item
  230. If there is a row in @code{A} that matches the @code{WHERE} clause, but there
  231. wasn't any row in @code{B} that matched the @code{LEFT JOIN} condition,
  232. then an extra @code{B} row is generated with all columns set to @code{NULL}.
  233. @item
  234. If you use @code{LEFT JOIN} to find rows that don't exist in some
  235. table and you have the following test: @code{column_name IS NULL} in the
  236. @code{WHERE} part, where column_name is a column that is declared as
  237. @code{NOT NULL}, then @strong{MySQL} will stop searching after more rows
  238. (for a particular key combination) after it has found one row that
  239. matches the @code{LEFT JOIN} condition.
  240. @end itemize
  241. @code{RIGHT JOIN} is implemented analogously as @code{LEFT JOIN}.
  242. The table read order forced by @code{LEFT JOIN} and @code{STRAIGHT JOIN}
  243. will help the join optimizer (which calculates in which order tables
  244. should be joined) to do its work much more quickly, as there are fewer
  245. table permutations to check.
  246. Note that the above means that if you do a query of type:
  247. @example
  248. SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
  249. @end example
  250. @strong{MySQL} will do a full scan on @code{b} as the @code{LEFT
  251. JOIN} will force it to be read before @code{d}.
  252. The fix in this case is to change the query to:
  253. @example
  254. SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
  255. @end example
  256. @cindex optimizing, LIMIT
  257. @findex LIMIT
  258. @node LIMIT optimization, Insert speed, LEFT JOIN optimization, Query Speed
  259. @subsection How MySQL Optimizes @code{LIMIT}
  260. In some cases @strong{MySQL} will handle the query differently when you are
  261. using @code{LIMIT #} and not using @code{HAVING}:
  262. @itemize @bullet
  263. @item
  264. If you are selecting only a few rows with @code{LIMIT}, @strong{MySQL}
  265. will use indexes in some cases when it normally would prefer to do a
  266. full table scan.
  267. @item
  268. If you use @code{LIMIT #} with @code{ORDER BY}, @strong{MySQL} will end the
  269. sorting as soon as it has found the first @code{#} lines instead of sorting
  270. the whole table.
  271. @item
  272. When combining @code{LIMIT #} with @code{DISTINCT}, @strong{MySQL} will stop
  273. as soon as it finds @code{#} unique rows.
  274. @item
  275. In some cases a @code{GROUP BY} can be resolved by reading the key in order
  276. (or do a sort on the key) and then calculate summaries until the
  277. key value changes.  In this case @code{LIMIT #} will not calculate any
  278. unnecessary @code{GROUP BY}'s.
  279. @item
  280. As soon as @strong{MySQL} has sent the first @code{#} rows to the client, it
  281. will abort the query.
  282. @item
  283. @code{LIMIT 0} will always quickly return an empty set.  This is useful
  284. to check the query and to get the column types of the result columns.
  285. @item
  286. The size of temporary tables uses the @code{LIMIT #} to calculate how much
  287. space is needed to resolve the query.
  288. @end itemize
  289. @cindex speed, inserting
  290. @cindex inserting, speed of
  291. @node Insert speed, Update speed, LIMIT optimization, Query Speed
  292. @subsection Speed of @code{INSERT} Queries
  293. The time to insert a record consists approximately of:
  294. @itemize @bullet
  295. @item
  296. Connect:                 (3)
  297. @item
  298. Sending query to server: (2)
  299. @item
  300. Parsing query:           (2)
  301. @item
  302. Inserting record:        (1 x size of record)
  303. @item
  304. Inserting indexes:       (1 x number of indexes)
  305. @item
  306. Close:                   (1)
  307. @end itemize
  308. where the numbers are somewhat proportional to the overall time. This
  309. does not take into consideration the initial overhead to open tables
  310. (which is done once for each concurrently running query).
  311. The size of the table slows down the insertion of indexes by N log N
  312. (B-trees).
  313. Some ways to speed up inserts:
  314. @itemize @bullet
  315. @item
  316. If you are inserting many rows from the same client at the same time, use
  317. multiple value lists @code{INSERT} statements. This is much faster (many
  318. times in some cases) than using separate @code{INSERT} statements.
  319. @item
  320. If you are inserting a lot of rows from different clients, you can get
  321. higher speed by using the @code{INSERT DELAYED} statement. @xref{INSERT,
  322. , @code{INSERT}}.
  323. @item
  324. Note that with @code{MyISAM} you can insert rows at the same time
  325. @code{SELECT}s are running if there are no deleted rows in the tables.
  326. @item
  327. When loading a table from a text file, use @code{LOAD DATA INFILE}. This
  328. is usually 20 times faster than using a lot of @code{INSERT} statements.
  329. @xref{LOAD DATA, , @code{LOAD DATA}}.
  330. @item
  331. It is possible with some extra work to make @code{LOAD DATA INFILE} run even
  332. faster when the table has many indexes. Use the following procedure:
  333. @enumerate
  334. @item
  335. Optionally create the table with @code{CREATE TABLE}. For example, using
  336. @code{mysql} or Perl-DBI.
  337. @item
  338. Execute a @code{FLUSH TABLES} statement or the shell command @code{mysqladmin
  339. flush-tables}.
  340. @item
  341. Use @code{myisamchk --keys-used=0 -rq /path/to/db/tbl_name}. This will
  342. remove all usage of all indexes from the table.
  343. @item
  344. Insert data into the table with @code{LOAD DATA INFILE}. This will not
  345. update any indexes and will therefore be very fast.
  346. @item
  347. If you are going to only read the table in the future, run @code{myisampack}
  348. on it to make it smaller. @xref{Compressed format}.
  349. @item
  350. Re-create the indexes with @code{myisamchk -r -q
  351. /path/to/db/tbl_name}. This will create the index tree in memory before
  352. writing it to disk, which is much faster because it avoids lots of disk
  353. seeks. The resulting index tree is also perfectly balanced.
  354. @item
  355. Execute a @code{FLUSH TABLES} statement or the shell command @code{mysqladmin
  356. flush-tables}.
  357. @end enumerate
  358. This procedure will be built into @code{LOAD DATA INFILE} in some future
  359. version of MySQL.
  360. @item
  361. You can speed up insertions by locking your tables:
  362. @example
  363. mysql> LOCK TABLES a WRITE;
  364. mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
  365. mysql> INSERT INTO a VALUES (8,26),(6,29);
  366. mysql> UNLOCK TABLES;
  367. @end example
  368. The main speed difference is that the index buffer is flushed to disk only
  369. once, after all @code{INSERT} statements have completed. Normally there would
  370. be as many index buffer flushes as there are different @code{INSERT}
  371. statements. Locking is not needed if you can insert all rows with a single
  372. statement.
  373. Locking will also lower the total time of multi-connection tests, but the
  374. maximum wait time for some threads will go up (because they wait for
  375. locks).  For example:
  376. @example
  377. thread 1 does 1000 inserts
  378. thread 2, 3, and 4 does 1 insert
  379. thread 5 does 1000 inserts
  380. @end example
  381. If you don't use locking, 2, 3, and 4 will finish before 1 and 5. If you
  382. use locking, 2, 3, and 4 probably will not finish before 1 or 5, but the
  383. total time should be about 40% faster.
  384. As @code{INSERT}, @code{UPDATE}, and @code{DELETE} operations are very
  385. fast in @strong{MySQL}, you will obtain better overall performance by
  386. adding locks around everything that does more than about 5 inserts or
  387. updates in a row.  If you do very many inserts in a row, you could do a
  388. @code{LOCK TABLES} followed by an @code{UNLOCK TABLES} once in a while
  389. (about each 1000 rows) to allow other threads access to the table. This
  390. would still result in a nice performance gain.
  391. Of course, @code{LOAD DATA INFILE} is much faster for loading data.
  392. @end itemize
  393. To get some more speed for both @code{LOAD DATA INFILE} and
  394. @code{INSERT}, enlarge the key buffer. @xref{Server parameters}.
  395. @node Update speed, Delete speed, Insert speed, Query Speed
  396. @subsection Speed of @code{UPDATE} Queries
  397. Update queries are optimized as a @code{SELECT} query with the additional
  398. overhead of a write. The speed of the write is dependent on the size of
  399. the data that is being updated and the number of indexes that are
  400. updated.  Indexes that are not changed will not be updated.
  401. Also, another way to get fast updates is to delay updates and then do
  402. many updates in a row later. Doing many updates in a row is much quicker
  403. than doing one at a time if you lock the table.
  404. Note that, with dynamic record format, updating a record to
  405. a longer total length may split the record.  So if you do this often,
  406. it is very important to @code{OPTIMIZE TABLE} sometimes.
  407. @xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}.
  408. @node Delete speed,  , Update speed, Query Speed
  409. @subsection Speed of @code{DELETE} Queries
  410. If you want to delete all rows in the table, you should use
  411. @code{TRUNCATE TABLE table_name}. @xref{TRUNCATE}.
  412. The time to delete a record is exactly proportional to the number of
  413. indexes. To delete records more quickly, you can increase the size of
  414. the index cache. @xref{Server parameters}.
  415. @cindex optimization, tips
  416. @cindex tips, optimization
  417. @node Tips, Benchmarks, Query Speed, Performance
  418. @section Other Optimization Tips
  419. Unsorted tips for faster systems:
  420. @itemize @bullet
  421. @item
  422. Use persistent connections to the database to avoid the connection
  423. overhead. If you can't use persistent connections and you are doing a
  424. lot of new connections to the database, you may want to change the value
  425. of the @code{thread_cache_size} variable. @xref{Server parameters}.
  426. @item
  427. Always check that all your queries really use the indexes you have created
  428. in the tables. In @strong{MySQL} you can do this with the @code{EXPLAIN}
  429. command. @xref{EXPLAIN, Explain, Explain, manual}.
  430. @item
  431. Try to avoid complex @code{SELECT} queries on tables that are updated a
  432. lot. This is to avoid problems with table locking.
  433. @item
  434. The new @code{MyISAM} tables can insert rows in a table without deleted
  435. rows at the same time another table is reading from it.  If this is important
  436. for you, you should consider methods where you don't have to delete rows
  437. or run @code{OPTIMIZE TABLE} after you have deleted a lot of rows.
  438. @item
  439. Use @code{ALTER TABLE ... ORDER BY expr1,expr2...} if you mostly
  440. retrieve rows in expr1,expr2.. order.  By using this option after big
  441. changes to the table, you may be able to get higher performance.
  442. @item
  443. In some cases it may make sense to introduce a column that is 'hashed'
  444. based on information from other columns. If this column is short and
  445. reasonably unique it may be much faster than a big index on many
  446. columns. In @strong{MySQL} it's very easy to use this extra column:
  447. @code{SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2))
  448. AND col_1='constant' AND col_2='constant'}
  449. @item
  450. For tables that change a lot you should try to avoid all @code{VARCHAR}
  451. or @code{BLOB} columns. You will get dynamic row length as soon as you
  452. are using a single @code{VARCHAR} or @code{BLOB} column. @xref{Table
  453. types}.
  454. @item
  455. It's not normally useful to split a table into different tables just
  456. because the rows gets 'big'. To access a row, the biggest performance
  457. hit is the disk seek to find the first byte of the row. After finding
  458. the data most new disks can read the whole row fast enough for most
  459. applications. The only cases where it really matters to split up a table is if
  460. it's a dynamic row size table (see above) that you can change to a fixed
  461. row size, or if you very often need to scan the table and don't need
  462. most of the columns. @xref{Table types}.
  463. @item
  464. If you very often need to calculate things based on information from a
  465. lot of rows (like counts of things), it's probably much better to
  466. introduce a new table and update the counter in real time. An update of
  467. type @code{UPDATE table set count=count+1 where index_column=constant}
  468. is very fast!
  469. This is really important when you use databases like @strong{MySQL} that
  470. only have table locking (multiple readers / single writers). This will
  471. also give better performance with most databases, as the row locking
  472. manager in this case will have less to do.
  473. @item
  474. If you need to collect statistics from big log tables, use summary tables
  475. instead of scanning the whole table. Maintaining the summaries should be
  476. much faster than trying to do statistics 'live'. It's much faster to
  477. regenerate new summary tables from the logs when things change
  478. (depending on business decisions) than to have to change the running
  479. application!
  480. @item
  481. If possible, one should classify reports as 'live' or 'statistical',
  482. where data needed for statistical reports are only generated based on
  483. summary tables that are generated from the actual data.
  484. @item
  485. Take advantage of the fact that columns have default values. Insert
  486. values explicitly only when the value to be inserted differs from the
  487. default. This reduces the parsing that @strong{MySQL} need to do and
  488. improves the insert speed.
  489. @item
  490. In some cases it's convenient to pack and store data into a blob. In this
  491. case you have to add some extra code in your appliction to pack/unpack
  492. things in the blob, but this may save a lot of accesses at some stage.
  493. This is practical when you have data that doesn't conform to a static
  494. table structure.
  495. @item
  496. Normally you should try to keep all data non-redundant (what
  497. is called 3rd normal form in database theory), but you should not be
  498. afraid of duplicating things or creating summary tables if you need these
  499. to gain more speed.
  500. @item
  501. Stored procedures or UDF (user-defined functions) may be a good way to
  502. get more performance.  In this case you should, however, always have a way
  503. to do this some other (slower) way if you use some database that doesn't
  504. support this.
  505. @item
  506. You can always gain something by caching queries/answers in your
  507. application and trying to do many inserts/updates at the same time.  If
  508. your database supports lock tables (like @strong{MySQL} and Oracle),
  509. this should help to ensure that the index cache is only flushed once
  510. after all updates.
  511. @item
  512. Use @code{INSERT /*! DELAYED */} when you do not need to know when your
  513. data is written. This speeds things up because many records can be written
  514. with a single disk write.
  515. @item
  516. Use @code{INSERT /*! LOW_PRIORITY */} when you want your selects to be
  517. more important.
  518. @item
  519. Use @code{SELECT /*! HIGH_PRIORITY */} to get selects that jump the
  520. queue. That is, the select is done even if there is somebody waiting to
  521. do a write.
  522. @item
  523. Use the multi-line @code{INSERT} statement to store many rows with one
  524. SQL command (many SQL servers supports this).
  525. @item
  526. Use @code{LOAD DATA INFILE} to load bigger amounts of data. This is
  527. faster than normal inserts and will be even faster when @code{myisamchk}
  528. is integrated in @code{mysqld}.
  529. @item
  530. Use @code{AUTO_INCREMENT} columns to make unique values.
  531. @item
  532. Use @code{OPTIMIZE TABLE} once in a while to avoid fragmentation when
  533. using dynamic table format. @xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}.
  534. @item
  535. Use @code{HEAP} tables to get more speed when possible. @xref{Table
  536. types}.
  537. @item
  538. When using a normal Web server setup, images should be stored as
  539. files. That is, store only a file reference in the database.  The main
  540. reason for this is that a normal Web server is much better at caching
  541. files than database contents. So it it's much easier to get a fast
  542. system if you are using files.
  543. @item
  544. Use in memory tables for non-critical data that are accessed often (like
  545. information about the last shown banner for users that don't have
  546. cookies).
  547. @item
  548. Columns with identical information in different tables should be
  549. declared identical and have identical names. Before Version 3.23 you
  550. got slow joins otherwise.
  551. Try to keep the names simple (use @code{name} instead of
  552. @code{customer_name} in the customer table). To make your names portable
  553. to other SQL servers you should keep them shorter than 18 characters.
  554. @item
  555. If you need REALLY high speed, you should take a look at the low-level
  556. interfaces for data storage that the different SQL servers support!  For
  557. example, by accessing the @strong{MySQL} @code{MyISAM} directly, you could
  558. get a speed increase of 2-5 times compared to using the SQL interface.
  559. To be able to do this the data must be on the same server as
  560. the application, and usually it should only be accessed by one process
  561. (because external file locking is really slow).  One could eliminate the
  562. above problems by introducing low-level @code{MyISAM} commands in the
  563. @strong{MySQL} server (this could be one easy way to get more
  564. performance if needed).  By carefully designing the database interface,
  565. it should be quite easy to support this types of optimization.
  566. @item
  567. In many cases it's faster to access data from a database (using a live
  568. connection) than accessing a text file, just because the database is
  569. likely to be more compact than the text file (if you are using numerical
  570. data), and this will involve fewer disk accesses.  You will also save
  571. code because you don't have to parse your text files to find line and
  572. column boundaries.
  573. @item
  574. You can also use replication to speed things up. @xref{Replication}.
  575. @item
  576. Declaring a table with @code{DELAY_KEY_WRITE=1} will make the updating of
  577. indexes faster, as these are not logged to disk until the file is closed.
  578. The downside is that you should run @code{myisamchk} on these tables before
  579. you start @code{mysqld} to ensure that they are okay if something killed
  580. @code{mysqld} in the middle.  As the key information can always be generated
  581. from the data, you should not lose anything by using @code{DELAY_KEY_WRITE}.
  582. @end itemize
  583. @cindex benchmarks
  584. @cindex performance, benchmarks
  585. @node Benchmarks, Design, Tips, Performance
  586. @section Using Your Own Benchmarks
  587. You should definately benchmark your application and database to find
  588. out where the bottlenecks are.  By fixing it (or by replacing the
  589. bottleneck with a 'dummy module') you can then easily identify the next
  590. bottleneck (and so on).  Even if the overall performance for your
  591. application is sufficient, you should at least make a plan for each
  592. bottleneck, and decide how to solve it if someday you really need the
  593. extra performance.
  594. For an example of portable benchmark programs, look at the @strong{MySQL}
  595. benchmark suite. @xref{MySQL Benchmarks, , @strong{MySQL} Benchmarks}. You
  596. can take any program from this suite and modify it for your needs. By doing this,
  597. you can try different solutions to your problem and test which is really the
  598. fastest solution for you.
  599. It is very common that some problems only occur when the system is very
  600. heavily loaded. We have had many customers who contact us when they
  601. have a (tested) system in production and have encountered load problems. In
  602. every one of these cases so far, it has been problems with basic design
  603. (table scans are NOT good at high load) or OS/Library issues. Most of
  604. this would be a @strong{LOT} easier to fix if the systems were not
  605. already in production.
  606. To avoid problems like this, you should put some effort into benchmarking
  607. your whole application under the worst possible load! You can use Sasha's
  608. recent hack for this -
  609. @uref{http://www.mysql.com/Downloads/super-smack/super-smack-1.0.tar.gz,
  610. super-smack}.
  611. As the name suggests, it can bring your system down to its knees if you ask it,
  612. so make sure to use it only on your developement systems.
  613. @cindex design, choices
  614. @cindex database design
  615. @cindex storage of data
  616. @node Design, Design Limitations, Benchmarks, Performance
  617. @section Design Choices
  618. @strong{MySQL} keeps row data and index data in separate files. Many (almost
  619. all) other databases mix row and index data in the same file. We believe that
  620. the @strong{MySQL} choice is better for a very wide range of modern systems.
  621. Another way to store the row data is to keep the information for each
  622. column in a separate area (examples are SDBM and Focus). This will cause a
  623. performance hit for every query that accesses more than one column. Because
  624. this degenerates so quickly when more than one column is accessed,
  625. we believe that this model is not good for general purpose databases.
  626. The more common case is that the index and data are stored together
  627. (like in Oracle/Sybase et al). In this case you will find the row
  628. information at the leaf page of the index. The good thing with this
  629. layout is that it, in many cases, depending on how well the index is
  630. cached, saves a disk read.  The bad things with this layout are:
  631. @itemize @bullet
  632. @item
  633. Table scanning is much slower because you have to read through the indexes
  634. to get at the data.
  635. @item
  636. You can't use only the index table to retrieve data for a query.
  637. @item
  638. You lose a lot of space, as you must duplicate indexes from the nodes
  639. (as you can't store the row in the nodes).
  640. @item
  641. Deletes will degenerate the table over time (as indexes in nodes are
  642. usually not updated on delete).
  643. @item
  644. It's harder to cache ONLY the index data.
  645. @end itemize
  646. @cindex design, limitations
  647. @node Design Limitations, Portability, Design, Performance
  648. @section MySQL Design Limitations/Tradeoffs
  649. Because @strong{MySQL} uses extremely fast table locking (multiple readers /
  650. single writers) the biggest remaining problem is a mix of a steady stream of
  651. inserts and slow selects on the same table.
  652. We believe that for a huge number of systems the extremely fast
  653. performance in other cases make this choice a win. This case is usually
  654. also possible to solve by having multiple copies of the table, but it
  655. takes more effort and hardware.
  656. We are also working on some extensions to solve this problem for some
  657. common application niches.
  658. @cindex portability
  659. @cindex crash-me program
  660. @cindex programs, crash-me
  661. @node Portability, Internal use, Design Limitations, Performance
  662. @section Portability
  663. Because all SQL servers implement different parts of SQL, it takes work to
  664. write portable SQL applications. For very simple selects/inserts it is
  665. very easy, but the more you need the harder it gets. If you want an
  666. application that is fast with many databases it becomes even harder!
  667. To make a complex application portable you need to choose a number of
  668. SQL servers that it should work with.
  669. You can use the @strong{MySQL} crash-me program/web-page
  670. @uref{http://www.mysql.com/information/crash-me.php} to find functions,
  671. types, and limits you can use with a selection of database
  672. servers. Crash-me now tests far from everything possible, but it
  673. is still comprehensive with about 450 things tested.
  674. For example, you shouldn't have column names longer than 18 characters
  675. if you want to be able to use Informix or DB2.
  676. Both the @strong{MySQL} benchmarks and crash-me programs are very
  677. database-independent.  By taking a look at how we have handled this, you
  678. can get a feeling for what you have to do to write your application
  679. database-independent.  The benchmarks themselves can be found in the
  680. @file{sql-bench} directory in the @strong{MySQL} source
  681. distribution. They are written in Perl with DBI database interface
  682. (which solves the access part of the problem).
  683. See @uref{http://www.mysql.com/information/benchmarks.html} for the results
  684. from this benchmark.
  685. As you can see in these results, all databases have some weak points. That
  686. is, they have different design compromises that lead to different
  687. behavior.
  688. If you strive for database independence, you need to get a good feeling
  689. for each SQL server's bottlenecks. @strong{MySQL} is VERY fast in
  690. retrieving and updating things, but will have a problem in mixing slow
  691. readers/writers on the same table. Oracle, on the other hand, has a big
  692. problem when you try to access rows that you have recently updated
  693. (until they are flushed to disk). Transaction databases in general are
  694. not very good at generating summary tables from log tables, as in this
  695. case row locking is almost useless.
  696. To get your application @emph{really} database-independent, you need to define
  697. an easy extendable interface through which you manipulate your data. As
  698. C++ is available on most systems, it makes sense to use a C++ classes
  699. interface to the databases.
  700. If you use some specific feature for some database (like the
  701. @code{REPLACE} command in @strong{MySQL}), you should code a method for
  702. the other SQL servers to implement the same feature (but slower).  With
  703. @strong{MySQL} you can use the @code{/*!  */} syntax to add
  704. @strong{MySQL}-specific keywords to a query.  The code inside
  705. @code{/**/} will be treated as a comment (ignored) by most other SQL
  706. servers.
  707. If REAL high performance is more important than exactness, as in some
  708. Web applications, a possibility is to create an application layer that
  709. caches all results to give you even higher performance. By letting
  710. old results 'expire' after a while, you can keep the cache reasonably
  711. fresh.  This is quite nice in case of extremely high load, in which case
  712. you can dynamically increase the cache and set the expire timeout higher
  713. until things get back to normal.
  714. In this case the table creation information should contain information
  715. of the initial size of the cache and how often the table should normally
  716. be refreshed.
  717. @cindex uses, of MySQL
  718. @cindex customers, of MySQL
  719. @node Internal use,  , Portability, Performance
  720. @section What Have We Used MySQL For?
  721. During @strong{MySQL} initial development, the features of @strong{MySQL} were made to fit
  722. our largest customer. They handle data warehousing for a couple of the
  723. biggest retailers in Sweden.
  724. From all stores, we get weekly summaries of all bonus card transactions,
  725. and we are expected to provide useful information for the store owners
  726. to help them find how their advertisement campaigns are affecting their
  727. customers.
  728. The data is quite huge (about 7 million summary transactions per month),
  729. and we have data for 4-10 years that we need to present to the users.
  730. We got weekly requests from the customers that they want to get
  731. 'instant' access to new reports from this data.
  732. We solved this by storing all information per month in compressed
  733. 'transaction' tables. We have a set of simple macros (script) that
  734. generates summary tables grouped by different criteria (product group,
  735. customer id, store ...) from the transaction tables.  The reports are
  736. Web pages that are dynamically generated by a small Perl script that
  737. parses a Web page, executes the SQL statements in it, and inserts the
  738. results. We would have used PHP or mod_perl instead but they were
  739. not available at that time.
  740. For graphical data we wrote a simple tool in @code{C} that can produce
  741. GIFs based on the result of a SQL query (with some processing of the
  742. result). This is also dynamically executed from the Perl script that
  743. parses the @code{HTML} files.
  744. In most cases a new report can simply be done by copying an existing
  745. script and modifying the SQL query in it.  In some cases, we will need to
  746. add more fields to an existing summary table or generate a new one, but
  747. this is also quite simple, as we keep all transactions tables on disk.
  748. (Currently we have at least 50G of transactions tables and 200G of other
  749. customer data.)
  750. We also let our customers access the summary tables directly with ODBC
  751. so that the advanced users can themselves experiment with the data.
  752. We haven't had any problems handling this with quite modest Sun Ultra
  753. SPARCstation (2x200 Mhz). We recently upgraded one of our servers to a 2
  754. CPU 400 Mhz UltraSPARC, and we are now planning to start handling
  755. transactions on the product level, which would mean a ten-fold increase
  756. of data. We think we can keep up with this by just adding more disk to
  757. our systems.
  758. We are also experimenting with Intel-Linux to be able to get more CPU
  759. power cheaper. Now that we have the binary portable database format (new
  760. in Version 3.23), we will start to use this for some parts of the application.
  761. Our initial feelings are that Linux will perform much better on
  762. low-to-medium load and Solaris will perform better when you start to get a
  763. high load because of extreme disk IO, but we don't yet have anything
  764. conclusive about this. After some discussion with a Linux Kernel
  765. developer, this might be a side effect of Linux giving so much resources
  766. to the batch job that the interactive performance gets very low. This
  767. makes the machine feel very slow and unresponsive while big batches are
  768. going. Hopefully this will be better handled in future Linux Kernels.
  769. @cindex benchmark suite
  770. @cindex crash-me program
  771. @node MySQL Benchmarks, Tools, Performance, Top
  772. @chapter The MySQL Benchmark Suite
  773. This should contain a technical description of the @strong{MySQL}
  774. benchmark suite (and @code{crash-me}), but that description is not
  775. written yet. Currently, you can get a good idea of the benchmark by
  776. looking at the code and results in the @file{sql-bench} directory in any
  777. @strong{MySQL} source distributions.
  778. This benchmark suite is meant to be a benchmark that will tell any user
  779. what things a given SQL implementation performs well or poorly at.
  780. Note that this benchmark is single threaded, so it measures the minimum
  781. time for the operations. We plan to in the future add a lot of
  782. multi-threaded tests to the benchmark suite.
  783. For example, (run on the same NT 4.0 machine):
  784. @multitable @columnfractions .6 .2 .2
  785. @strong{Reading 2000000 rows by index} @tab @strong{Seconds} @tab @strong{Seconds}
  786. @item mysql             @tab 367 @tab 249
  787. @item mysql_odbc @tab 464
  788. @item db2_odbc @tab 1206
  789. @item informix_odbc @tab 121126
  790. @item ms-sql_odbc @tab 1634
  791. @item oracle_odbc @tab 20800
  792. @item solid_odbc @tab 877
  793. @item sybase_odbc @tab 17614
  794. @end multitable
  795. @multitable @columnfractions .6 .2 .2
  796. @strong{Inserting (350768) rows} @tab @strong{Seconds} @tab @strong{Seconds}
  797. @item mysql @tab 381 @tab 206
  798. @item mysql_odbc @tab 619
  799. @item db2_odbc @tab 3460
  800. @item informix_odbc @tab 2692
  801. @item ms-sql_odbc @tab 4012
  802. @item oracle_odbc @tab 11291
  803. @item solid_odbc @tab 1801
  804. @item sybase_odbc @tab 4802
  805. @end multitable
  806. In the above test @strong{MySQL} was run with a 8M index cache.
  807. We have gather some more benchmark results at
  808. @uref{http://www.mysql.com/information/benchmarks.html}.
  809. Note that Oracle is not included because they asked to be removed. All
  810. Oracle benchmarks have to be passed by Oracle! We believe that makes
  811. Oracle benchmarks @strong{VERY} biased because the above benchmarks are
  812. supposed to show what a standard installation can do for a single
  813. client.
  814. To run the benchmark suite, you have to download a MySQL source distribution
  815. install the perl DBI driver, the perl DBD driver for the database you want to
  816. test and then do:
  817. @example
  818. cd sql-bench
  819. perl run-all-tests --server=#
  820. @end example
  821. where # is one of supported servers. You can get a list of all options
  822. and supported servers by doing @code{run-all-tests --help}.
  823. @cindex crash-me
  824. @code{crash-me} tries to determine what features a database supports and
  825. what it's capabilities and limitations are by actually running
  826. queries. For example, it determines:
  827. @itemize @bullet
  828. @item
  829. What column types are supported
  830. @item
  831. How many indexes are supported
  832. @item
  833. What functions are supported
  834. @item
  835. How big a query can be
  836. @item
  837. How big a @code{VARCHAR} column can be
  838. @end itemize
  839. We can find the result from crash-me on a lot of different databases at
  840. @uref{http://www.mysql.com/information/crash-me.php}.
  841. @cindex utilities
  842. @node Tools, Maintenance, MySQL Benchmarks, Top
  843. @chapter MySQL Utilites
  844. @menu
  845. * Programs::                    What do the executables do?
  846. * safe_mysqld::                 safe_mysqld, the wrapper around mysqld
  847. * mysqld_multi::                Program for managing multiple @strong{MySQL} servers
  848. * mysql::                       The command line tool
  849. * mysqladmin::                  Administering a @strong{MySQL} server
  850. * mysqldump::                   Dumping the structure and data from @strong{MySQL} databases and tables
  851. * mysqlhotcopy::                Copying @strong{MySQL} Databases and Tables
  852. * mysqlimport::                 Importing data from text files
  853. * perror::                      Displaying error messages
  854. * mysqlshow::                   Showing databases, tables and columns
  855. * myisampack::                  The @strong{MySQL} compressed read-only table generator
  856. @end menu
  857. @cindex environment variables
  858. @cindex programs, list of
  859. @node Programs, safe_mysqld, Tools, Tools
  860. @section Overview of the Different MySQL Programs
  861. All @strong{MySQL} clients that communicate with the server using the
  862. @code{mysqlclient} library use the following environment variables:
  863. @tindex MYSQL_UNIX_PORT environment variable
  864. @tindex Environment variable, MYSQL_UNIX_PORT
  865. @tindex MYSQL_TCP_PORT environment variable
  866. @tindex Environment variable, MYSQL_TCP_PORT
  867. @tindex MYSQL_PWD environment variable
  868. @tindex Environment variable, MYSQL_PWD
  869. @tindex MYSQL_DEBUG environment variable
  870. @tindex Environment variable, MYSQL_DEBUG
  871. @multitable @columnfractions .25 .75
  872. @item @strong{Name} @tab @strong{Description}
  873. @item @code{MYSQL_UNIX_PORT} @tab The default socket; used for connections to @code{localhost}
  874. @item @code{MYSQL_TCP_PORT}  @tab The default TCP/IP port
  875. @item @code{MYSQL_PWD} @tab The default password
  876. @item @code{MYSQL_DEBUG} @tab Debug-trace options when debugging
  877. @item @code{TMPDIR} @tab The directory where temporary tables/files are created
  878. @end multitable
  879. Use of @code{MYSQL_PWD} is insecure.
  880. @xref{Connecting}.
  881. @tindex MYSQL_HISTFILE environment variable
  882. @tindex Environment variable, MYSQL_HISTFILE
  883. @tindex HOME environment variable
  884. @tindex Environment variable, HOME
  885. @cindex history file
  886. @cindex command line history
  887. @tindex .mysql_history file
  888. The @file{mysql} client uses the file named in the @code{MYSQL_HISTFILE}
  889. environment variable to save the command-line history. The default value for
  890. the history file is @file{$HOME/.mysql_history}, where @code{$HOME} is the
  891. value of the @code{HOME} environment variable. @xref{Environment variables}.
  892. All @strong{MySQL} programs take many different options. However, every
  893. @strong{MySQL} program provides a @code{--help} option that you can use
  894. to get a full description of the program's different options. For example, try
  895. @code{mysql --help}.
  896. You can override default options for all standard client programs with an
  897. option file. @ref{Option files}.
  898. The list below briefly describes the @strong{MySQL} programs:
  899. @table @code
  900. @cindex @code{myisamchk}
  901. @item myisamchk
  902. Utility to describe, check, optimize, and repair @strong{MySQL} tables.
  903. Because @code{myisamchk} has many functions, it is described in its own
  904. chapter. @xref{Maintenance}.
  905. @cindex @code{make_binary_distribution}
  906. @item make_binary_distribution
  907. Makes a binary release of a compiled @strong{MySQL}. This could be sent
  908. by FTP to @file{/pub/mysql/Incoming} on @code{support.mysql.com} for the
  909. convenience of other @strong{MySQL} users.
  910. @cindex @code{msql2mysql}
  911. @item msql2mysql
  912. A shell script that converts @code{mSQL} programs to @strong{MySQL}. It doesn't
  913. handle all cases, but it gives a good start when converting.
  914. @cindex @code{mysqlaccess}
  915. @item mysqlaccess
  916. A script that checks the access privileges for a host, user, and database
  917. combination.
  918. @cindex @code{mysqladmin}
  919. @item mysqladmin
  920. Utility for performing administrative operations, such as creating or
  921. dropping databases, reloading the grant tables, flushing tables to disk, and
  922. reopening log files.  @code{mysqladmin} can also be used to retrieve version,
  923. process, and status information from the server.
  924. @xref{mysqladmin, , @code{mysqladmin}}.
  925. @cindex @code{mysqlbug}
  926. @item mysqlbug
  927. The @strong{MySQL} bug report script.  This script should always be used when
  928. filing a bug report to the @strong{MySQL} list.
  929. @cindex @code{mysqld}
  930. @item mysqld
  931. The SQL daemon. This should always be running.
  932. @cindex @code{mysqldump}
  933. @item mysqldump
  934. Dumps a @strong{MySQL} database into a file as SQL statements or
  935. as tab-separated text files. Enhanced freeware originally by Igor Romanenko.
  936. @xref{mysqldump, , @code{mysqldump}}.
  937. @cindex @code{mysqlimport}
  938. @item mysqlimport
  939. Imports text files into their respective tables using @code{LOAD DATA
  940. INFILE}. @xref{mysqlimport, , @code{mysqlimport}}.
  941. @cindex @code{mysqlshow}
  942. @item mysqlshow
  943. Displays information about databases, tables, columns, and indexes.
  944. @cindex @code{mysql_install_db}
  945. @item mysql_install_db
  946. Creates the @strong{MySQL} grant tables with default privileges. This is
  947. usually executed only once, when first installing @strong{MySQL}
  948. on a system.
  949. @cindex @code{replace}
  950. @item replace
  951. A utility program that is used by @code{msql2mysql}, but that has more
  952. general applicability as well.  @code{replace} changes strings in place in
  953. files or on the standard input. Uses a finite state machine to match longer
  954. strings first. Can be used to swap strings. For example, this command
  955. swaps @code{a} and @code{b} in the given files:
  956. @example
  957. shell> replace a b b a -- file1 file2 ...
  958. @end example
  959. @end table
  960. @cindex tools, safe_mysqld
  961. @cindex scripts
  962. @cindex @code{safe_mysqld}
  963. @node safe_mysqld, mysqld_multi, Programs, Tools
  964. @section safe_mysqld, the wrapper around mysqld
  965. @code{safe_mysqld} is the recommended way to start a @code{mysqld}
  966. daemon on Unix.  @code{safe_mysqld} adds some safety features such as
  967. restarting the server when an error occurs and logging run-time
  968. information to a log file.
  969. Normally one should never edit the @code{safe_mysqld} script, but
  970. instead put the options to @code{safe_mysqld} in the
  971. @code{[safe_mysqld]} section in the @code{my.cnf}
  972. file. @code{safe_mysqld} will read all options from the @code{[mysqld]},
  973. @code{[server]} and @code{[safe_mysqld]} sections from the option files.
  974. @xref{Option files}.
  975. Note that all options on the command line to @code{safe_mysqld} are passed
  976. to @code{mysqld}.  If you wants to use any options in @code{safe_mysqld} that
  977. @code{mysqld} doesn't support, you must specify these in the option file.
  978. Most of the options to @code{safe_mysqld} are the same as the options to
  979. @code{mysqld}. @xref{Command-line options}.
  980. @code{safe_mysqld} supports the following options:
  981. @table @code
  982. @item --basedir=path
  983. @item --core-file-size=#
  984. Size of the core file @code{mysqld} should be able to create. Passed to @code{ulimit -c}.
  985. @item --datadir=path
  986. @item --defaults-extra-file=path
  987. @item --defaults-file=path
  988. @item --err-log=path
  989. @item --ledir=path
  990. Path to @code{mysqld}
  991. @item --log=path
  992. @item --mysqld=mysqld-version
  993. Name of the mysqld version in the @code{ledir} directory you want to start.
  994. @item --no-defaults
  995. @item --open-files-limit=#
  996. Number of files @code{mysqld} should be able to open. Passed to @code{ulimit -n}. Note that you need to start @code{safe_mysqld} as root for this to work properly!
  997. @item --pid-file=path
  998. @item --port=#
  999. @item --socket=path
  1000. @item --timezone=#
  1001. Set the timezone (the @code{TZ}) variable to the value of this parameter.
  1002. @item --user=#
  1003. @end table
  1004. The @code{safe_mysqld} script is written so that it normally is able to start
  1005. a server that was installed from either a source or a binary version of
  1006. @strong{MySQL}, even if these install the server in slightly different
  1007. locations.  @code{safe_mysqld} expects one of these conditions to be true:
  1008. @itemize @bullet
  1009. @item
  1010. The server and databases can be found relative to the directory from which
  1011. @code{safe_mysqld} is invoked.  @code{safe_mysqld} looks under its working
  1012. directory for @file{bin} and @file{data} directories (for binary
  1013. distributions) or for @file{libexec} and @file{var} directories (for source
  1014. distributions).  This condition should be met if you execute
  1015. @code{safe_mysqld} from your @strong{MySQL} installation directory (for
  1016. example, @file{/usr/local/mysql} for a binary distribution).
  1017. @item
  1018. If the server and databases cannot be found relative to the working directory,
  1019. @code{safe_mysqld} attempts to locate them by absolute pathnames.  Typical
  1020. locations are @file{/usr/local/libexec} and @file{/usr/local/var}.
  1021. The actual locations are determined when the distribution was built from which
  1022. @code{safe_mysqld} comes.  They should be correct if
  1023. @strong{MySQL} was installed in a standard location.
  1024. @end itemize
  1025. Because @code{safe_mysqld} will try to find the server and databases relative
  1026. to its own working directory, you can install a binary distribution of
  1027. @strong{MySQL} anywhere, as long as you start @code{safe_mysqld} from the
  1028. @strong{MySQL} installation directory:
  1029. @example
  1030. shell> cd mysql_installation_directory
  1031. shell> bin/safe_mysqld &
  1032. @end example
  1033. If @code{safe_mysqld} fails, even when invoked from the @strong{MySQL}
  1034. installation directory, you can modify it to use the path to @code{mysqld}
  1035. and the pathname options that are correct for your system.  Note that if you
  1036. upgrade @strong{MySQL} in the future, your modified version of
  1037. @code{safe_mysqld} will be overwritten, so you should make a copy of your
  1038. edited version that you can reinstall.
  1039. @cindex tools, mysqld_multi
  1040. @cindex scripts
  1041. @cindex multi mysqld
  1042. @cindex @code{mysqld_multi}
  1043. @node  mysqld_multi, mysql, safe_mysqld, Tools
  1044. @section mysqld_multi, program for managing multiple @strong{MySQL} servers
  1045. @code{mysqld_multi} is meant for managing several @code{mysqld}
  1046. processes running in different UNIX sockets and TCP/IP ports.
  1047. The program will search for group(s) named [mysqld#] from my.cnf (or the
  1048. given --config-file=...), where # can be any positive number starting
  1049. from 1. These groups should be the same as the usual @code{[mysqld]}
  1050. group (e.g. options to mysqld, see @strong{MySQL} manual for detailed
  1051. information about this group), but with those port, socket etc. options
  1052. that are wanted for each separate @code{mysqld} processes. The number in
  1053. the group name has another function; it can be used for starting,
  1054. stopping, or reporting some specific @code{mysqld} servers with this
  1055. program. See the usage and options below for more information.
  1056. @example
  1057. Usage: mysqld_multi [OPTIONS] @{start|stop|report@} [GNR,GNR,GNR...]
  1058. or     mysqld_multi [OPTIONS] @{start|stop|report@} [GNR-GNR,GNR,GNR-GNR,...]
  1059. @end example
  1060. The GNR above means the group number. You can start, stop or report
  1061. any GNR, or several of them at the same time. (See --example) The GNRs
  1062. list can be comma separated, or a dash combined, of which the latter
  1063. means that all the GNRs between GNR1-GNR2 will be affected. Without
  1064. GNR argument all the found groups will be either started, stopped, or
  1065. reported. Note that you must not have any white spaces in the GNR
  1066. list. Anything after a white space are ignored.
  1067. @code{mysqld_multi} supports the following options:
  1068. @table @code
  1069. @cindex config-file option
  1070. @item --config-file=...
  1071. Alternative config file. NOTE: This will not affect this program's own
  1072. options (group @code{[mysqld_multi]}), but only groups
  1073. [mysqld#]. Without this option everything will be searched from the
  1074. ordinary my.cnf file.
  1075. @cindex example option
  1076. @item --example
  1077. Give an example of a config file.
  1078. @cindex help option
  1079. @item --help
  1080. Print this help and exit.
  1081. @cindex log option
  1082. @item --log=...
  1083. Log file. Full path to and the name for the log file. NOTE: If the file
  1084. exists, everything will be appended.
  1085. @cindex mysqladmin option
  1086. @item --mysqladmin=...
  1087. @code{mysqladmin} binary to be used for a server shutdown.
  1088. @cindex mysqld option
  1089. @item --mysqld=...
  1090. @code{mysqld} binary to be used. Note that you can give
  1091. @code{safe_mysqld} to this option also. The options are passed to
  1092. @code{mysqld}. Just make sure you have @code{mysqld} in your environment
  1093. variable @code{PATH} or fix @code{safe_mysqld}.
  1094. @cindex no-log option
  1095. @item --no-log
  1096. Print to stdout instead of the log file. By default the log file is
  1097. turned on.
  1098. @cindex password option
  1099. @item --password=...
  1100. Password for user for @code{mysqladmin}.
  1101. @cindex tcp-ip option
  1102. @item --tcp-ip
  1103. Connect to the @strong{MySQL} server(s) via the TCP/IP port instead of
  1104. the UNIX socket. This affects stopping and reporting.  If a socket file
  1105. is missing, the server may still be running, but can be accessed only
  1106. via the TCP/IP port.  By default connecting is done via the UNIX socket.
  1107. @cindex user option
  1108. @item --user=...
  1109. @strong{MySQL} user for @code{mysqladmin}.
  1110. @cindex version option
  1111. @item --version
  1112. Print the version number and exit.
  1113. @end table
  1114. Some notes about @code{mysqld_multi}:
  1115. @itemize @bullet
  1116. @item
  1117. Make sure that the @strong{MySQL} user, who is stopping the
  1118. @code{mysqld} services (e.g using the @code{mysqladmin}) have the same
  1119. password and username for all the data directories accessed (to the
  1120. 'mysql' database) And make sure that the user has the 'Shutdown_priv'
  1121. privilege! If you have many data- directories and many different 'mysql'
  1122. databases with different passwords for the @strong{MySQL} 'root' user,
  1123. you may want to create a common 'multi_admin' user for each using the
  1124. same password (see below). Example how to do it:
  1125. @example
  1126. shell> mysql -u root -S /tmp/mysql.sock -proot_password -e
  1127. "GRANT SHUTDOWN ON *.* TO multi_admin@@localhost IDENTIFIED BY 'multipass'"
  1128. @xref{Privileges}.
  1129. @end example
  1130. You will have to do the above for each @code{mysqld} running in each
  1131. data directory, that you have (just change the socket, -S=...)
  1132. @item
  1133. @code{pid-file} is very important, if you are using @code{safe_mysqld}
  1134. to start @code{mysqld} (e.g. --mysqld=safe_mysqld) Every @code{mysqld}
  1135. should have it's own @code{pid-file}. The advantage using
  1136. @code{safe_mysqld} instead of @code{mysqld} directly here is, that
  1137. @code{safe_mysqld} 'guards' every @code{mysqld} process and will restart
  1138. it, if a @code{mysqld} process fails due to signal kill -9, or
  1139. similar. (Like segmentation fault, which @strong{MySQL} should never do,
  1140. of course ;) Please note that @code{safe_mysqld} script may require that
  1141. you start it from a certain place. This means that you may have to CD to
  1142. a certain directory, before you start the @code{mysqld_multi}. If
  1143. you have problems starting, please see the @code{safe_mysqld}
  1144. script. Check especially the lines:
  1145. @example
  1146. --------------------------------------------------------------------------
  1147. MY_PWD=`pwd` Check if we are starting this relative (for the binary
  1148. release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys
  1149. -a -x ./bin/mysqld
  1150. --------------------------------------------------------------------------
  1151. @xref{safe_mysqld}.
  1152. @end example
  1153. The above test should be successful, or you may encounter problems.
  1154. @item
  1155. Beware of the dangers starting multiple @code{mysqlds} in the same data
  1156. directory.  Use separate data directories, unless you @strong{KNOW} what
  1157. you are doing!
  1158. @item
  1159. The socket file and the TCP/IP port must be different for every @code{mysqld}.
  1160. @item
  1161. The first and fifth @code{mysqld} group were intentionally left out from
  1162. the example.  You may have 'gaps' in the config file. This gives you
  1163. more flexibility.  The order in which the @code{mysqlds} are started or
  1164. stopped depends on the order in which they appear in the config file.
  1165. @item
  1166. When you want to refer to a certain group using GNR with this program,
  1167. just use the number in the end of the group name ( [mysqld# <== ).
  1168. @item
  1169. You may want to use option '--user' for @code{mysqld}, but in order to
  1170. do this you need to be root when you start the @code{mysqld_multi}
  1171. script. Having the option in the config file doesn't matter; you will
  1172. just get a warning, if you are not the superuser and the @code{mysqlds}
  1173. are started under @strong{YOUR} UNIX account. @strong{IMPORTANT}: Make
  1174. sure that the @code{pid-file} and the data directory are
  1175. read+write(+execute for the latter one) accessible for @strong{THAT}
  1176. UNIX user, who the specific @code{mysqld} process is started
  1177. as. @strong{DON'T} use the UNIX root account for this, unless you
  1178. @strong{KNOW} what you are doing!
  1179. @item
  1180. @strong{MOST IMPORTANT}: Make sure that you understand the meanings of
  1181. the options that are passed to the @code{mysqlds} and why @strong{WOULD
  1182. YOU WANT} to have separate @code{mysqld} processes. Starting multiple
  1183. @code{mysqlds} in one data directory @strong{WILL NOT} give you extra
  1184. performance in a threaded system!
  1185. @end itemize
  1186. @xref{Multiple servers}.
  1187. This is an example of the config file on behalf of @code{mysqld_multi}.
  1188. @example
  1189. # This file should probably be in your home dir (~/.my.cnf) or /etc/my.cnf
  1190. # Version 2.1 by Jani Tolonen
  1191. [mysqld_multi]
  1192. mysqld     = /usr/local/bin/safe_mysqld
  1193. mysqladmin = /usr/local/bin/mysqladmin
  1194. user       = multi_admin
  1195. password   = multipass
  1196. [mysqld2]
  1197. socket     = /tmp/mysql.sock2
  1198. port       = 3307
  1199. pid-file   = /usr/local/mysql/var2/hostname.pid2
  1200. datadir    = /usr/local/mysql/var2
  1201. language   = /usr/local/share/mysql/english
  1202. user       = john
  1203. [mysqld3]
  1204. socket     = /tmp/mysql.sock3
  1205. port       = 3308
  1206. pid-file   = /usr/local/mysql/var3/hostname.pid3
  1207. datadir    = /usr/local/mysql/var3
  1208. language   = /usr/local/share/mysql/swedish
  1209. user       = monty
  1210. [mysqld4]
  1211. socket     = /tmp/mysql.sock4
  1212. port       = 3309
  1213. pid-file   = /usr/local/mysql/var4/hostname.pid4
  1214. datadir    = /usr/local/mysql/var4
  1215. language   = /usr/local/share/mysql/estonia
  1216. user       = tonu
  1217. [mysqld6]
  1218. socket     = /tmp/mysql.sock6
  1219. port       = 3311
  1220. pid-file   = /usr/local/mysql/var6/hostname.pid6
  1221. datadir    = /usr/local/mysql/var6
  1222. language   = /usr/local/share/mysql/japanese
  1223. user       = jani
  1224. @end example
  1225. @xref{Option files}.
  1226. @cindex command line tool
  1227. @cindex tools, command line
  1228. @cindex scripts
  1229. @cindex @code{mysql}
  1230. @node mysql, mysqladmin, mysqld_multi, Tools
  1231. @section The Command-line Tool
  1232. @code{mysql} is a simple SQL shell (with GNU @code{readline} capabilities).
  1233. It supports interactive and non-interactive use. When used interactively,
  1234. query results are presented in an ASCII-table format. When used
  1235. non-interactively (for example, as a filter), the result is presented in
  1236. tab-separated format.  (The output format can be changed using command-line
  1237. options.)  You can run scripts simply like this:
  1238. @example
  1239. shell> mysql database < script.sql > output.tab
  1240. @end example
  1241. If you have problems due to insufficient memory in the client, use the
  1242. @code{--quick} option!  This forces @code{mysql} to use
  1243. @code{mysql_use_result()} rather than @code{mysql_store_result()} to
  1244. retrieve the result set.
  1245. Using @code{mysql} is very easy. Just start it as follows:
  1246. @code{mysql database} or @code{mysql --user=user_name --password=your_password database}. Type a SQL statement, end it with @samp{;}, @samp{g}, or @samp{G}
  1247. and press RETURN/ENTER.
  1248. @cindex command line options
  1249. @cindex options, command line
  1250. @cindex startup parameters
  1251. @code{mysql} supports the following options:
  1252. @table @code
  1253. @cindex help option
  1254. @item -?, --help
  1255. Display this help and exit.
  1256. @cindex automatic rehash option
  1257. @item -A, --no-auto-rehash
  1258. No automatic rehashing. One has to use 'rehash' to get table and field
  1259. completion. This gives a quicker start of mysql.
  1260. @cindex batch option
  1261. @item -B, --batch
  1262. Print results with a tab as separator, each row on a new line. Doesn't use
  1263. history file.
  1264. @cindex character sets option
  1265. @item --character-sets-dir=...
  1266. Directory where character sets are located.
  1267. @cindex compress option.
  1268. @item -C, --compress
  1269. Use compression in server/client protocol.
  1270. @cindex debug option
  1271. @item -#, --debug[=...]
  1272. Debug log. Default is 'd:t:o,/tmp/mysql.trace'.
  1273. @cindex database option
  1274. @item -D, --database=...
  1275. Database to use. This is mainly useful in the @code{my.cnf} file.
  1276. @cindex default character set option
  1277. @item --default-character-set=...
  1278. Set the default character set.
  1279. @cindex execute option
  1280. @item -e, --execute=...
  1281. Execute command and quit. (Output like with --batch)
  1282. @cindex vertical option
  1283. @item -E, --vertical
  1284. Print the output of a query (rows) vertically. Without this option you
  1285. can also force this output by ending your statements with @code{G}.
  1286. @cindex force option
  1287. @item -f, --force
  1288. Continue even if we get a SQL error.
  1289. @cindex no-named-commands option
  1290. @item -g, --no-named-commands
  1291. Named commands are disabled. Use * form only, or use named commands
  1292. only in the beginning of a line ending with a semicolon (;). Since
  1293. Version 10.9, the client now starts with this option ENABLED by default!
  1294. With the -g option, long format commands will still work from the first
  1295. line, however.
  1296. @cindex enable-named-commands option
  1297. @item -G, --enable-named-commands
  1298. Named commands are @strong{enabled}.  Long format commands are allowed as
  1299. well as shortened * commands.
  1300. @cindex ignore space option.
  1301. @item -i, --ignore-space
  1302. Ignore space after function names.
  1303. @cindex host option
  1304. @item -h, --host=...
  1305. Connect to the given host.
  1306. @cindex html option
  1307. @item -H, --html
  1308. Produce HTML output.
  1309. @cindex skip line numbers option
  1310. @item -L, --skip-line-numbers
  1311. Don't write line number for errors. Useful when one wants to compare result
  1312. files that includes error messages
  1313. @cindex no pager option
  1314. @item --no-pager
  1315. Disable pager and print to stdout. See interactive help (h) also.
  1316. @cindex no tee option
  1317. @item --no-tee
  1318. Disable outfile. See interactive help (h) also.
  1319. @cindex unbuffered option.
  1320. @item -n, --unbuffered
  1321. Flush buffer after each query.
  1322. @cindex skip column names option
  1323. @item -N, --skip-column-names
  1324. Don't write column names in results.
  1325. @cindex set variable option
  1326. @item -O, --set-variable var=option
  1327. Give a variable a value. @code{--help} lists variables.
  1328. @cindex one database option
  1329. @item -o, --one-database
  1330. Only update the default database. This is useful for skipping updates to
  1331. other database in the update log.
  1332. @cindex pager option
  1333. @item @code{--pager[=...]}
  1334. Output type. Default is your @code{ENV} variable @code{PAGER}. Valid
  1335. pagers are less, more, cat [> filename], etc.  See interactive help (h)
  1336. also. This option does not work in batch mode. Pager works only in UNIX.
  1337. @cindex password option
  1338. @item -p[password], --password[=...]
  1339. Password to use when connecting to server. If a password is not given on
  1340. the command line, you will be prompted for it.  Note that if you use the
  1341. short form @code{-p} you can't have a space between the option and the
  1342. password.
  1343. @item -P  --port=...
  1344. TCP/IP port number to use for connection.
  1345. @cindex quick option
  1346. @item -q, --quick
  1347. Don't cache result, print it row-by-row. This may slow down the server
  1348. if the output is suspended. Doesn't use history file.
  1349. @cindex raw option
  1350. @item -r, --raw
  1351. Write column values without escape conversion. Used with @code{--batch}
  1352. @cindex silent option
  1353. @item -s, --silent
  1354. Be more silent.
  1355. @item -S  --socket=...
  1356. Socket file to use for connection.
  1357. @cindex table option
  1358. @item -t  --table
  1359. Output in table format. This is default in non-batch mode.
  1360. @item -T, --debug-info
  1361. Print some debug information at exit.
  1362. @cindex tee option
  1363. @item --tee=...
  1364. Append everything into outfile. See interactive help (h) also. Does not
  1365. work in batch mode.
  1366. @cindex user option
  1367. @item -u, --user=#
  1368. User for login if not current user.
  1369. @cindex safe updates option
  1370. @item -U, --safe-updates[=#], --i-am-a-dummy[=#]
  1371. Only allow @code{UPDATE} and @code{DELETE} that uses keys. See below for
  1372. more information about this option.  You can reset this option if you have
  1373. it in your @code{my.cnf} file by using @code{--safe-updates=0}.
  1374. @cindex verbose option
  1375. @item -v, --verbose
  1376. More verbose output (-v -v -v gives the table output format).
  1377. @cindex version option
  1378. @item -V, --version
  1379. Output version information and exit.
  1380. @cindex wait option
  1381. @item -w, --wait
  1382. Wait and retry if connection is down instead of aborting.
  1383. @end table
  1384. You can also set the following variables with @code{-O} or
  1385. @code{--set-variable}:
  1386. @cindex timeout
  1387. @multitable @columnfractions .3 .2 .5
  1388. @item Variablename @tab Default @tab Description
  1389. @item connect_timeout @tab 0 @tab Number of seconds before timeout connection.
  1390. @item max_allowed_packet @tab 16777216 @tab Max packetlength to send/receive from to server
  1391. @item net_buffer_length @tab 16384 @tab Buffer for TCP/IP and socket communication
  1392. @item select_limit @tab 1000 @tab Automatic limit for SELECT when using --i-am-a-dummy
  1393. @item max_join_size @tab 1000000 @tab Automatic limit for rows in a join when using --i-am-a-dummy.
  1394. @end multitable
  1395. If you type 'help' on the command line, @code{mysql} will print out the
  1396. commands that it supports:
  1397. @cindex commands, list of
  1398. @example
  1399. mysql> help
  1400. MySQL commands:
  1401. help    (h)    Display this text.
  1402. ?       (h)    Synonym for `help'.
  1403. clear   (c)    Clear command.
  1404. connect (r)    Reconnect to the server. Optional arguments are db and host.
  1405. edit    (e)    Edit command with $EDITOR.
  1406. ego     (G)    Send command to mysql server, display result vertically.
  1407. exit    (q)    Exit mysql. Same as quit.
  1408. go      (g)    Send command to mysql server.
  1409. nopager (n)    Disable pager, print to stdout.
  1410. notee   (t)    Don't write into outfile.
  1411. pager   (P)    Set PAGER [to_pager]. Print the query results via PAGER.
  1412. print   (p)    Print current command.
  1413. quit    (q)    Quit mysql.
  1414. rehash  (#)    Rebuild completion hash.
  1415. source  (.)    Execute a SQL script file. Takes a file name as an argument.
  1416. status  (s)    Get status information from the server.
  1417. tee     (T)    Set outfile [to_outfile]. Append everything into given outfile.
  1418. use     (u)    Use another database. Takes database name as argument.
  1419. @end example
  1420. From the above, pager only works in UNIX.
  1421. @cindex status command
  1422. The @code{status} command gives you some information about the
  1423. connection and the server you are using. If you are running in the
  1424. @code{--safe-updates} mode, @code{status} will also print the values for
  1425. the @code{mysql} variables that affect your queries.
  1426. @cindex @code{safe-mode} command
  1427. A useful startup option for beginners (introduced in @strong{MySQL}
  1428. Version 3.23.11) is @code{--safe-mode} (or @code{--i-am-a-dummy} for
  1429. users that has at some time done a @code{DELETE FROM table_name} but
  1430. forgot the @code{WHERE} clause.  When using this option, @code{mysql}
  1431. sends the following command to the @strong{MySQL} server when opening
  1432. the connection:
  1433. @example
  1434. SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
  1435.     SQL_MAX_JOIN_SIZE=#max_join_size#"
  1436. @end example
  1437. where @code{#select_limit#} and @code{#max_join_size#} are variables that
  1438. can be set from the @code{mysql} command line. @xref{SET OPTION, @code{SET}}.
  1439. The effect of the above is:
  1440. @itemize @bullet
  1441. @item
  1442. You are not allowed to do an @code{UPDATE} or @code{DELETE} statement
  1443. if you don't have a key constraint in the @code{WHERE} part. One can,
  1444. however, force an @code{UPDATE/DELETE} by using @code{LIMIT}:
  1445. @example
  1446. UPDATE table_name SET not_key_column=# WHERE not_key_column=# LIMIT 1;
  1447. @end example
  1448. @item
  1449. All big results are automatically limited to @code{#select_limit#} rows.
  1450. @item
  1451. @code{SELECT}'s that will probably need to examine more than
  1452. @code{#max_join_size} row combinations will be aborted.
  1453. @end itemize
  1454. Some useful hints about the @code{mysql} client:
  1455. Some data is much more readable when displayed vertically, instead of
  1456. the usual horizontal box type output. For example longer text, which
  1457. includes new lines, is often much easier to be read with vertical
  1458. output.
  1459. @example
  1460. mysql> select * from mails where length(txt) < 300 limit 300,1G
  1461. *************************** 1. row ***************************
  1462.   msg_nro: 3068
  1463.      date: 2000-03-01 23:29:50
  1464. time_zone: +0200
  1465. mail_from: Monty
  1466.     reply: monty@@no.spam.com
  1467.   mail_to: "Thimble Smith" <tim@@no.spam.com>
  1468.       sbj: UTF-8
  1469.       txt: >>>>> "Thimble" == Thimble Smith writes:
  1470. Thimble> Hi.  I think this is a good idea.  Is anyone familiar with UTF-8
  1471. Thimble> or Unicode?  Otherwise I'll put this on my TODO list and see what
  1472. Thimble> happens.
  1473. Yes, please do that.
  1474. Regards,
  1475. Monty
  1476.      file: inbox-jani-1
  1477.      hash: 190402944
  1478. 1 row in set (0.09 sec)
  1479. @end example
  1480. @itemize @bullet
  1481. @item
  1482. For logging, you can use the @code{tee} option. The @code{tee} can be
  1483. started with option @code{--tee=...}, or from the command line
  1484. interactively with command @code{tee}. All the data displayed on the
  1485. screen will also be appended into a given file. This can be very useful
  1486. for debugging purposes also. The @code{tee} can be disabled from the
  1487. command line with command @code{notee}. Executing @code{tee} again
  1488. starts logging again. Without a parameter the previous file will be
  1489. used. Note that @code{tee} will flush the results into the file after
  1490. each command, just before the command line appears again waiting for the
  1491. next command.
  1492. @item
  1493. Browsing, or searching the results in the interactive mode in UNIX less,
  1494. more, or any other similar program, is now possible with option
  1495. @code{--pager[=...]}. Without argument, @code{mysql} client will look
  1496. for environment variable PAGER and set @code{pager} to that.
  1497. @code{pager} can be started from the interactive command line with
  1498. command @code{pager} and disabled with command @code{nopager}.  The
  1499. command takes an argument optionally and the @code{pager} will be set to
  1500. that. Command @code{pager} can be called without an argument, but this
  1501. requires that the option @code{--pager} was used, or the @code{pager}
  1502. will default to stdout. @code{pager} works only in UNIX, since it uses
  1503. the popen() function, which doesn't exist in Windows. In Windows, the
  1504. @code{tee} option can be used instead, although it may not be as handy
  1505. as @code{pager} can be in some situations.
  1506. @item
  1507. A few tips about @code{pager}: You can use it to write to a file:
  1508. @example
  1509. mysql> pager cat > /tmp/log.txt
  1510. @end example
  1511. and the results will only go to a file. You can also pass any options
  1512. for the programs that you want to use with the @code{pager}:
  1513. @example
  1514. mysql> pager less -n -i -S
  1515. @end example
  1516. From the above do note the option '-S'. You may find it very useful when
  1517. browsing the results; try the option with horizontal output (end
  1518. commands with 'g', or ';') and with vertical output (end commands with
  1519. 'G'). Sometimes a very wide result set is hard to be read from the screen,
  1520. with option -S to less you can browse the results within the interactive
  1521. less from left to right, preventing lines longer than your screen from
  1522. being continued to the next line. This can make the result set much more
  1523. readable. You can swith the mode between on and off within the interactive
  1524. less with '-S'. See the 'h' for more help about less.
  1525. @item
  1526. Last (unless you already understood this from the above examples ;) you
  1527. can combine very complex ways to handle the results, for example the
  1528. following would send the results to two files in two different
  1529. directories, on two different hard-disks mounted on /dr1 and /dr2, yet
  1530. let the results still be seen on the screen via less:
  1531. @example
  1532. mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
  1533. @end example
  1534. @item
  1535. You can also combine the two functions above; have the @code{tee}
  1536. enabled, @code{pager} set to 'less' and you will be able to browse the
  1537. results in unix 'less' and still have everything appended into a file
  1538. the same time. The difference between @code{UNIX tee} used with the
  1539. @code{pager} and the @code{mysql} client in-built @code{tee}, is that
  1540. the in-built @code{tee} works even if you don't have the @code{UNIX tee}
  1541. available. The in-built @code{tee} also logs everything that is printed
  1542. on the screen, where the @code{UNIX tee} used with @code{pager} doesn't
  1543. log quite that much. Last, but not least, the interactive @code{tee} is
  1544. more handy to switch on and off, when you want to log something into a
  1545. file, but want to be able to turn the feature off sometimes.
  1546. @end itemize
  1547. @cindex administration, server
  1548. @cindex server administration
  1549. @cindex @code{mysladmn}
  1550. @node mysqladmin, mysqldump, mysql, Tools
  1551. @section Administering a MySQL Server
  1552. A utility for performing administrative operations. The syntax is:
  1553. @example
  1554. shell> mysqladmin [OPTIONS] command [command-option] command ...
  1555. @end example
  1556. You can get a list of the options your version of @code{mysqladmin} supports
  1557. by executing @code{mysqladmin --help}.
  1558. The current @code{mysqladmin} supports the following commands:
  1559. @multitable @columnfractions .3 .7
  1560. @item create databasename @tab Create a new database.
  1561. @item drop databasename  @tab Delete a database and all its tables.
  1562. @item extended-status @tab Gives an extended status message from the server.
  1563. @item flush-hosts @tab Flush all cached hosts.
  1564. @item flush-logs @tab Flush all logs.
  1565. @item flush-tables @tab Flush all tables.
  1566. @item flush-privileges @tab Reload grant tables (same as reload).
  1567. @item kill id,id,...  @tab Kill mysql threads.
  1568. @item password @tab New-password. Change old password to new-password.
  1569. @item ping @tab Check if mysqld is alive.
  1570. @item processlist @tab Show list of active threads in server.
  1571. @item reload @tab Reload grant tables.
  1572. @item refresh @tab Flush all tables and close and open logfiles.
  1573. @item shutdown @tab Take server down.
  1574. @item slave-start @tab Start slave replication thread.
  1575. @item slave-stop @tab Stop slave replication thread.
  1576. @item status @tab Gives a short status message from the server.
  1577. @item variables @tab Prints variables available.
  1578. @item version @tab Get version info from server.
  1579. @end multitable
  1580. All commands can be shortened to their unique prefix.  For example:
  1581. @example
  1582. shell> mysqladmin proc stat
  1583. +----+-------+-----------+----+-------------+------+-------+------+
  1584. | Id | User  | Host      | db | Command     | Time | State | Info |
  1585. +----+-------+-----------+----+-------------+------+-------+------+
  1586. | 6  | monty | localhost |    | Processlist | 0    |       |      |
  1587. +----+-------+-----------+----+-------------+------+-------+------+
  1588. Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 2  Memory in use: 1092K  Max memory used: 1116K
  1589. @end example
  1590. @cindex status command, results
  1591. The @code{mysqladmin status} command result has the following columns:
  1592. @cindex uptime
  1593. @multitable @columnfractions .3 .7
  1594. @item Uptime @tab Number of seconds the @strong{MySQL} server has been up.
  1595. @cindex threads
  1596. @item Threads @tab Number of active threads (clients).
  1597. @cindex questions
  1598. @item Questions @tab Number of questions from clients since @code{mysqld} was started.
  1599. @cindex slow queries
  1600. @item Slow queries @tab Queries that have taken more than @code{long_query_time} seconds. @xref{Slow query log}.
  1601. @cindex opens
  1602. @item Opens @tab How many tables @code{mysqld} has opened.
  1603. @cindex flush tables
  1604. @cindex tables, flush
  1605. @item Flush tables @tab Number of @code{flush ...}, @code{refresh}, and @code{reload} commands.
  1606. @cindex open tables
  1607. @item Open tables @tab Number of tables that are open now.
  1608. @cindex memory use
  1609. @item Memory in use @tab Memory allocated directly by the mysqld code (only available when @strong{MySQL} is compiled with --with-debug).
  1610. @cindex max memory used
  1611. @item Max memory used @tab Maximum memory allocated directly by the mysqld code (only available when @strong{MySQL} is compiled with --with-debug).
  1612. @end multitable
  1613. If you do @code{myslqadmin shutdown} on a socket (in other words, on a
  1614. the computer where @code{mysqld} is running), @code{mysqladmin} will
  1615. wait until the @strong{MySQL} @code{pid-file} is removed to ensure that
  1616. the @code{mysqld} server has stopped properly.
  1617. @cindex dumping, databases
  1618. @cindex databases, dumping
  1619. @cindex tables, dumping
  1620. @cindex backing up, databases
  1621. @node mysqldump, mysqlhotcopy, mysqladmin, Tools
  1622. @section Dumping the Structure and Data from MySQL Databases and Tables
  1623. @cindex @code{mysqldump}
  1624. Utility to dump a database or a collection of database for backup or for
  1625. transferring the data to another SQL server (not necessarily a MySQL
  1626. server).  The dump will contain SQL statements to create the table
  1627. and/or populate the table.
  1628. If you are doing a backup on the server, you should consider using
  1629. the @code{mysqlhotcopy} instead. @xref{mysqlhotcopy}.
  1630. @example
  1631. shell> mysqldump [OPTIONS] database [tables]
  1632. OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
  1633. OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
  1634. @end example
  1635. If you don't give any tables or use the @code{--databases} or
  1636. @code{--all-databases}, the whole database(s) will be dumped.
  1637. You can get a list of the options your version of @code{mysqldump} supports
  1638. by executing @code{mysqldump --help}.
  1639. Note that if you run @code{mysqldump} without @code{--quick} or
  1640. @code{--opt}, @code{mysqldump} will load the whole result set into
  1641. memory before dumping the result.  This will probably be a problem if
  1642. you are dumping a big database.
  1643. Note that if you are using a new copy of the @code{mysqldump} program
  1644. and you are going to do a dump that will be read into a very old @strong{MySQL}
  1645. server, you should not use the @code{--opt} or @code{-e} options.
  1646. @code{mysqldump} supports the following options:
  1647. @table @code
  1648. @item --add-locks
  1649. Add @code{LOCK TABLES} before and @code{UNLOCK TABLE} after each table dump.
  1650. (To get faster inserts into @strong{MySQL}.)
  1651. @item --add-drop-table
  1652. Add a @code{drop table} before each create statement.
  1653. @item -A, --all-databases
  1654. Dump all the databases. This will be same as @code{--databases} with all
  1655. databases selected.
  1656. @item -a, --all
  1657. Include all @strong{MySQL}-specific create options.
  1658. @item --allow-keywords
  1659. Allow creation of column names that are keywords.  This works by
  1660. prefixing each column name with the table name.
  1661. @item -c, --complete-insert
  1662. Use complete insert statements (with column names).
  1663. @item -C, --compress
  1664. Compress all information between the client and the server if both support
  1665. compression.
  1666. @item -B, --databases
  1667. To dump several databases. Note the difference in usage. In this case
  1668. no tables are given. All name arguments are regarded as databasenames.
  1669. @code{USE db_name;} will be included in the output before each new database.
  1670. @item --delayed
  1671. Insert rows with the @code{INSERT DELAYED} command.
  1672. @item -e, --extended-insert
  1673. Use the new multiline @code{INSERT} syntax. (Gives more compact and
  1674. faster inserts statements.)
  1675. @item -#, --debug[=option_string]
  1676. Trace usage of the program (for debugging).
  1677. @item --help
  1678. Display a help message and exit.
  1679. @item --fields-terminated-by=...
  1680. @itemx --fields-enclosed-by=...
  1681. @itemx --fields-optionally-enclosed-by=...
  1682. @itemx --fields-escaped-by=...
  1683. @itemx --lines-terminated-by=...
  1684. These options are used with the @code{-T} option and have the same
  1685. meaning as the corresponding clauses for @code{LOAD DATA INFILE}.
  1686. @xref{LOAD DATA, , @code{LOAD DATA}}.
  1687. @item -F, --flush-logs
  1688. Flush log file in the @strong{MySQL} server before starting the dump.
  1689. @item -f, --force,
  1690. Continue even if we get a SQL error during a table dump.
  1691. @item -h, --host=..
  1692. Dump data from the @strong{MySQL} server on the named host. The default host
  1693. is @code{localhost}.
  1694. @item -l, --lock-tables.
  1695. Lock all tables before starting the dump.  The tables are locked with
  1696. @code{READ LOCAL} to allow concurrent inserts in the case of @code{MyISAM}
  1697. tables.
  1698. @item -n, --no-create-db
  1699. 'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;' will not be put in the
  1700. output. The above line will be added otherwise, if --databases or
  1701. --all-databases option was given.
  1702. @item -t, --no-create-info
  1703. Don't write table creation information (The @code{CREATE TABLE} statement.)
  1704. @item -d, --no-data
  1705. Don't write any row information for the table.  This is very useful if you
  1706. just want to get a dump of the structure for a table!
  1707. @item --opt
  1708. Same as @code{--quick --add-drop-table --add-locks --extended-insert
  1709. --lock-tables}.  Should give you the fastest possible dump for reading
  1710. into a @strong{MySQL} server.
  1711. @item -pyour_pass, --password[=your_pass]
  1712. The password to use when connecting to the server. If you specify
  1713. no @samp{=your_pass} part,
  1714. @code{mysqldump} you will be prompted for a password.
  1715. @item -P port_num, --port=port_num
  1716. The TCP/IP port number to use for connecting to a host.  (This is used for
  1717. connections to hosts other than @code{localhost}, for which Unix sockets are
  1718. used.)
  1719. @item  -q, --quick
  1720. Don't buffer query, dump directly to stdout. Uses @code{mysql_use_result()}
  1721. to do this.
  1722. @item -S /path/to/socket, --socket=/path/to/socket
  1723. The socket file to use when connecting to @code{localhost} (which is the
  1724. default host).
  1725. @item --tables
  1726. Overrides option --databases (-B).
  1727. @item  -T, --tab=path-to-some-directory
  1728. Creates a @code{table_name.sql} file, that contains the SQL CREATE commands,
  1729. and a @code{table_name.txt} file, that contains the data, for each give table.
  1730. @strong{NOTE}: This only works if @code{mysqldump} is run on the same
  1731. machine as the @code{mysqld} daemon.  The format of the @code{.txt} file
  1732. is made according to the @code{--fields-xxx} and @code{--lines--xxx} options.
  1733. @item -u user_name, --user=user_name
  1734. The @strong{MySQL} user name to use when connecting to the server. The
  1735. default value is your Unix login name.
  1736. @item -O var=option, --set-variable var=option
  1737. Set the value of a variable.  The possible variables are listed below.
  1738. @item -v, --verbose
  1739. Verbose mode.  Print out more information on what the program does.
  1740. @item -V, --version
  1741. Print version information and exit.
  1742. @item -w, --where='where-condition'
  1743. Dump only selected records. Note that QUOTES are mandatory:
  1744. @example
  1745. "--where=user='jimf'" "-wuserid>1" "-wuserid<1"
  1746. @end example
  1747. @item -O net_buffer_length=#, where # < 16M
  1748. When creating multi-row-insert statements (as with option
  1749. @code{--extended-insert} or @code{--opt}), @code{mysqldump} will create
  1750. rows up to @code{net_buffer_length} length. If you increase this
  1751. variable, you should also ensure that the @code{max_allowed_packet}
  1752. variable in the @strong{MySQL} server is bigger than the
  1753. @code{net_buffer_length}.
  1754. @end table
  1755. The most normal use of @code{mysqldump} is probably for making a backup of
  1756. whole databases. @xref{Backup}.
  1757. @example
  1758. mysqldump --opt database > backup-file.sql
  1759. @end example
  1760. You can read this back into @strong{MySQL} with:
  1761. @example
  1762. mysql database < backup-file.sql
  1763. @end example
  1764. or
  1765. @example
  1766. mysql -e "source /patch-to-backup/backup-file.sql" database
  1767. @end example
  1768. However, it's also very useful to populate another @strong{MySQL} server with
  1769. information from a database:
  1770. @example
  1771. mysqldump --opt database | mysql ---host=remote-host -C database
  1772. @end example
  1773. It is possible to dump several databases with one command:
  1774. @example
  1775. mysqldump --databases database1 [database2 database3...] > my_databases.sql
  1776. @end example
  1777. If all the databases are wanted, one can use:
  1778. @example
  1779. mysqldump --all-databases > all_databases.sql
  1780. @end example
  1781. @cindex dumping, databases
  1782. @cindex databases, dumping
  1783. @cindex tables, dumping
  1784. @cindex backing up, databases
  1785. @node mysqlhotcopy, mysqlimport, mysqldump, Tools
  1786. @section Copying MySQL Databases and Tables
  1787. @code{mysqlhotcopy} is a perl script that uses @code{LOCK TABLES},
  1788. @code{FLUSH TABLES} and @code{cp} or @code{scp} to quickly make a backup
  1789. of a database.  It's the fastest way to make a backup of the database,
  1790. but it can only be run on the same machine where the database directories
  1791. are.
  1792. @example
  1793. mysqlhotcopy db_name [/path/to/new_directory]
  1794. mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory
  1795. mysqlhotcopy db_name./regex/
  1796. @end example
  1797. @code{mysqlhotcopy} supports the following options:
  1798. @table @code
  1799. @item -?, --help
  1800. Display a helpscreen and exit
  1801. @item -u, --user=# 
  1802. User for database login
  1803. @item -p, --password=#
  1804. Password to use when connecting to server
  1805. @item -P, --port=# 
  1806. Port to use when connecting to local server
  1807. @item -S, --socket=#
  1808. Socket to use when connecting to local server
  1809. @item --allowold
  1810. Don't abort if target already exists (rename it _old)
  1811. @item --keepold
  1812. Don't delete previous (now renamed) target when done
  1813. @item --noindices
  1814. Don't include full index files in copy to make the backup smaller and faster
  1815. The indexes can later be reconstructed with @code{myisamchk -rq.}.
  1816. @item --method=#
  1817. Method for copy (@code{cp} or @code{scp}).
  1818. @item -q, --quiet
  1819. Be silent except for errors
  1820. @item --debug
  1821. Enable debug
  1822. @item -n, --dryrun
  1823. Report actions without doing them
  1824. @item --regexp=#
  1825. Copy all databases with names matching regexp
  1826. @item --suffix=#
  1827. Suffix for names of copied databases
  1828. @item --checkpoint=#
  1829. Insert checkpoint entry into specified db.table
  1830. @item --flushlog
  1831. Flush logs once all tables are locked.
  1832. @item --tmpdir=#
  1833. Temporary directory (instead of /tmp).
  1834. @end table
  1835. You can use 'perldoc mysqlhotcopy' to get a more complete documentation for
  1836. @code{mysqlhotcopy}.
  1837. @code{mysqlhotcopy} reads the group @code{[mysqlhotcopy]} from the option
  1838. files.
  1839. @cindex importing, data
  1840. @cindex data, importing
  1841. @cindex files, text
  1842. @cindex text files, importing
  1843. @cindex @code{mysqlimport}
  1844. @node mysqlimport, perror, mysqlhotcopy, Tools
  1845. @section Importing Data from Text Files
  1846. @code{mysqlimport} provides a command-line interface to the @code{LOAD DATA
  1847. INFILE} SQL statement.  Most options to @code{mysqlimport} correspond
  1848. directly to the same options to @code{LOAD DATA INFILE}.
  1849. @xref{LOAD DATA, , @code{LOAD DATA}}.
  1850. @code{mysqlimport} is invoked like this:
  1851. @example
  1852. shell> mysqlimport [options] database textfile1 [textfile2....]
  1853. @end example
  1854. For each text file named on the command line,
  1855. @code{mysqlimport} strips any extension from the filename and uses the result
  1856. to determine which table to import the file's contents into.  For example,
  1857. files named @file{patient.txt}, @file{patient.text}, and @file{patient} would
  1858. all be imported into a table named @code{patient}.
  1859. @code{mysqlimport} supports the following options:
  1860. @table @code
  1861. @item -c, --columns=...
  1862. This option takes a comma-separated list of field names as an argument.
  1863. The field list is passed to LOAD DATA INFILE MySQL sql command, which
  1864. mysqlimport calls MySQL to execute. For more information, please see
  1865. @code{LOAD DATA INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.
  1866. @item -C, --compress
  1867. Compress all information between the client and the server if both support
  1868. compression.
  1869. @item -#, --debug[=option_string]
  1870. Trace usage of the program (for debugging).
  1871. @item -d, --delete
  1872. Empty the table before importing the text file.
  1873. @item --fields-terminated-by=...
  1874. @itemx --fields-enclosed-by=...
  1875. @itemx --fields-optionally-enclosed-by=...
  1876. @itemx --fields-escaped-by=...
  1877. @itemx --lines-terminated-by=...
  1878. These options have the same meaning as the corresponding clauses for
  1879. @code{LOAD DATA INFILE}. @xref{LOAD DATA, , @code{LOAD DATA}}.
  1880. @item -f, --force
  1881. Ignore errors.  For example, if a table for a text file doesn't exist,
  1882. continue processing any remaining files.  Without @code{--force},
  1883. @code{mysqlimport} exits if a table doesn't exist.
  1884. @item --help
  1885. Display a help message and exit.
  1886. @item -h host_name, --host=host_name
  1887. Import data to the @strong{MySQL} server on the named host. The default host
  1888. is @code{localhost}.
  1889. @item -i, --ignore
  1890. See the description for the @code{--replace} option.
  1891. @item -l, --lock-tables
  1892. Lock @strong{ALL} tables for writing before processing any text files. This
  1893. ensures that all tables are synchronized on the server.
  1894. @item -L, --local
  1895. Read input files from the client.  By default, text files are assumed to be on
  1896. the server if you connect to @code{localhost} (which is the default host).
  1897. @item -pyour_pass, --password[=your_pass]
  1898. The password to use when connecting to the server. If you specify
  1899. no @samp{=your_pass} part,
  1900. @code{mysqlimport} you will be prompted for a password.
  1901. @item -P port_num, --port=port_num
  1902. The TCP/IP port number to use for connecting to a host.  (This is used for
  1903. connections to hosts other than @code{localhost}, for which Unix sockets are
  1904. used.)
  1905. @item -r, --replace
  1906. The @code{--replace} and @code{--ignore} options control handling of input
  1907. records that duplicate existing records on unique key values.  If you specify
  1908. @code{--replace}, new rows replace existing rows that have the same unique key
  1909. value. If you specify @code{--ignore}, input rows that duplicate an existing
  1910. row on a unique key value are skipped.  If you don't specify either option, an
  1911. error occurs when a duplicate key value is found, and the rest of the text
  1912. file is ignored.
  1913. @item  -s, --silent
  1914. Silent mode.  Write output only when errors occur.
  1915. @item -S /path/to/socket, --socket=/path/to/socket
  1916. The socket file to use when connecting to @code{localhost} (which is the
  1917. default host).
  1918. @item -u user_name, --user=user_name
  1919. The @strong{MySQL} user name to use when connecting to the server. The
  1920. default value is your Unix login name.
  1921. @item -v, --verbose
  1922. Verbose mode.  Print out more information what the program does.
  1923. @item -V, --version
  1924. Print version information and exit.
  1925. @end table
  1926. Here is a sample run using @code{mysqlimport}:
  1927. @example
  1928. $ mysql --version
  1929. mysql  Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
  1930. $ uname -a
  1931. Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
  1932. $ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
  1933. $ ed
  1934. a
  1935. 100     Max Sydow
  1936. 101     Count Dracula
  1937. .
  1938. w imptest.txt
  1939. 32
  1940. q
  1941. $ od -c imptest.txt
  1942. 0000000   1   0   0  t   M   a   x       S   y   d   o   w  n   1   0
  1943. 0000020   1  t   C   o   u   n   t       D   r   a   c   u   l   a  n
  1944. 0000040
  1945. $ mysqlimport --local test imptest.txt
  1946. test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
  1947. $ mysql -e 'SELECT * FROM imptest' test
  1948. +------+---------------+
  1949. | id   | n             |
  1950. +------+---------------+
  1951. |  100 | Max Sydow     |
  1952. |  101 | Count Dracula |
  1953. +------+---------------+
  1954. @end example
  1955. @cindex error messages, displaying
  1956. @cindex perror
  1957. @node perror, mysqlshow, mysqlimport, Tools
  1958. @section Converting an error code to the corresponding error message
  1959. @code{perror} can be used to print error message(s). @code{perror} can
  1960. be invoked like this:
  1961. @example
  1962. shell> perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
  1963. For example:
  1964. shell> perror 64 79
  1965. Error code  64:  Machine is not on the network
  1966. Error code  79:  Can not access a needed shared library
  1967. @end example
  1968. @code{perror} can be used to display a description for a system error
  1969. code, or an MyISAM/ISAM table handler error code. The error messages
  1970. are mostly system dependent.
  1971. @cindex databases, displaying
  1972. @cindex displaying, database information
  1973. @cindex tables, displaying
  1974. @cindex columns, displaying
  1975. @cindex showing, database information
  1976. @node mysqlshow, myisampack, perror, Tools
  1977. @section Showing Databases, Tables, and Columns
  1978. @code{mysqlshow} can be used to quickly look at which databases exist,
  1979. their tables, and the table's columns.
  1980. With the @code{mysql} program you can get the same information with the
  1981. @code{SHOW} commands.  @xref{SHOW}.
  1982. @code{mysqlshow} is invoked like this:
  1983. @example
  1984. shell> mysqlshow [OPTIONS] [database [table [column]]]
  1985. @end example
  1986. @itemize @bullet
  1987. @item
  1988. If no database is given, all matching databases are shown.
  1989. @item
  1990. If no table is given, all matching tables in the database are shown.
  1991. @item
  1992. If no column is given, all matching columns and column types in the table
  1993. are shown.
  1994. @end itemize
  1995. Note that in newer @strong{MySQL} versions, you only see those
  1996. database/tables/columns for which you have some privileges.
  1997. If the last argument contains a shell or SQL wild-card (@code{*}, @code{?},
  1998. @code{%} or @code{_}) then only what's matched by the wild card is shown.
  1999. This may cause some confusion when you try to display the columns for a
  2000. table with a @code{_} as in this case @code{mysqlshow} only shows you
  2001. the table names that match the pattern.  This is easily fixed by
  2002. adding an extra @code{%} last on the command line (as a separate
  2003. argument).
  2004. @cindex compressed tables
  2005. @cindex tables, compressed
  2006. @cindex MyISAM, compressed tables
  2007. @cindex @code{myisampack}
  2008. @cindex @code{pack_isam}
  2009. @node myisampack,  , mysqlshow, Tools
  2010. @section The MySQL Compressed Read-only Table Generator
  2011. @code{myisampack} is used to compress MyISAM tables, and @code{pack_isam}
  2012. is used to compress ISAM tables. Because ISAM tables are deprecated, we
  2013. will only discuss @code{myisampack} here, but everything said about
  2014. @code{myisampack} should also be true for @code{pack_isam}.
  2015. @code{myisampack} works by compressing each column in the table separately.
  2016. The information needed to decompress columns is read into memory when the
  2017. table is opened. This results in much better performance when accessing
  2018. individual records, because you only have to uncompress exactly one record, not
  2019. a much larger disk block as when using Stacker on MS-DOS.
  2020. Usually, @code{myisampack} packs the data file 40%-70%.
  2021. @strong{MySQL} uses memory mapping (@code{mmap()}) on compressed tables and
  2022. falls back to normal read/write file usage if @code{mmap()} doesn't work.
  2023. There are currently two limitations with @code{myisampack}:
  2024. @itemize @bullet
  2025. @item
  2026. After packing, the table is read-only.
  2027. @item
  2028. @code{myisampack} can also pack @code{BLOB} or @code{TEXT} columns. The
  2029. older @code{pack_isam} could not do this.
  2030. @end itemize
  2031. Fixing these limitations is on our TODO list but with low priority.
  2032. @code{myisampack} is invoked like this:
  2033. @example
  2034. shell> myisampack [options] filename ...
  2035. @end example
  2036. Each filename should be the name of an index (@file{.MYI}) file.  If you
  2037. are not in the database directory, you should specify the pathname to the
  2038. file.  It is permissible to omit the @file{.MYI} extension.
  2039. @code{myisampack} supports the following options:
  2040. @table @code
  2041. @item -b, --backup
  2042. Make a backup of the table as @code{tbl_name.OLD}.
  2043. @item -#, --debug=debug_options
  2044. Output debug log. The @code{debug_options} string often is
  2045. @code{'d:t:o,filename'}.
  2046. @item -f, --force
  2047. Force packing of the table even if it becomes bigger or if the temporary file
  2048. exists.  @code{myisampack} creates a temporary file named @file{tbl_name.TMD}
  2049. while it compresses the table.  If you kill @code{myisampack}, the @file{.TMD}
  2050. file may not be deleted.  Normally, @code{myisampack} exits with an error if
  2051. it finds that @file{tbl_name.TMD} exists.  With @code{--force},
  2052. @code{myisampack} packs the table anyway.
  2053. @item -?, --help
  2054. Display a help message and exit.
  2055. @item -j big_tbl_name, --join=big_tbl_name
  2056. Join all tables named on the command line into a single table
  2057. @code{big_tbl_name}.  All tables that are to be combined
  2058. MUST be identical (same column names and types, same indexes, etc.).
  2059. @item -p #, --packlength=#
  2060. Specify the record length storage size, in bytes.  The value should be 1, 2,
  2061. or 3.  (@code{myisampack} stores all rows with length pointers of 1, 2, or 3
  2062. bytes.  In most normal cases, @code{myisampack} can determine the right length
  2063. value before it begins packing the file, but it may notice during the packing
  2064. process that it could have used a shorter length. In this case,
  2065. @code{myisampack} will print a note that the next time you pack the same file,
  2066. you could use a shorter record length.)
  2067. @item -s, --silent
  2068. Silent mode.  Write output only when errors occur.
  2069. @item -t, --test
  2070. Don't actually pack table, just test packing it.
  2071. @item -T dir_name, --tmp_dir=dir_name
  2072. Use the named directory as the location in which to write the temporary table.
  2073. @item -v, --verbose
  2074. Verbose mode.  Write information about progress and packing result.
  2075. @item -V, --version
  2076. Display version information and exit.
  2077. @item -w, --wait
  2078. Wait and retry if table is in use.  If the @code{mysqld} server was
  2079. invoked with the @code{--skip-locking} option, it is not a good idea to
  2080. invoke @code{myisampack} if the table might be updated during the
  2081. packing process.
  2082. @end table
  2083. @cindex examples, compressed tables
  2084. The sequence of commands shown below illustrates a typical table compression
  2085. session:
  2086. @example
  2087. shell> ls -l station.*
  2088. -rw-rw-r--   1 monty    my         994128 Apr 17 19:00 station.MYD
  2089. -rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
  2090. -rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm
  2091. shell> myisamchk -dvv station
  2092. MyISAM file:     station
  2093. Isam-version:  2
  2094. Creation time: 1996-03-13 10:08:58
  2095. Recover time:  1997-02-02  3:06:43
  2096. Data records:              1192  Deleted blocks:              0
  2097. Datafile: Parts:           1192  Deleted data:                0
  2098. Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
  2099. Max datafile length:   54657023  Max keyfile length:   33554431
  2100. Recordlength:               834
  2101. Record format: Fixed length
  2102. table description:
  2103. Key Start Len Index   Type                       Root  Blocksize    Rec/key
  2104. 1   2     4   unique  unsigned long              1024       1024          1
  2105. 2   32    30  multip. text                      10240       1024          1
  2106. Field Start Length Type
  2107. 1     1     1
  2108. 2     2     4
  2109. 3     6     4
  2110. 4     10    1
  2111. 5     11    20
  2112. 6     31    1
  2113. 7     32    30
  2114. 8     62    35
  2115. 9     97    35
  2116. 10    132   35
  2117. 11    167   4
  2118. 12    171   16
  2119. 13    187   35
  2120. 14    222   4
  2121. 15    226   16
  2122. 16    242   20
  2123. 17    262   20
  2124. 18    282   20
  2125. 19    302   30
  2126. 20    332   4
  2127. 21    336   4
  2128. 22    340   1
  2129. 23    341   8
  2130. 24    349   8
  2131. 25    357   8
  2132. 26    365   2
  2133. 27    367   2
  2134. 28    369   4
  2135. 29    373   4
  2136. 30    377   1
  2137. 31    378   2
  2138. 32    380   8
  2139. 33    388   4
  2140. 34    392   4
  2141. 35    396   4
  2142. 36    400   4
  2143. 37    404   1
  2144. 38    405   4
  2145. 39    409   4
  2146. 40    413   4
  2147. 41    417   4
  2148. 42    421   4
  2149. 43    425   4
  2150. 44    429   20
  2151. 45    449   30
  2152. 46    479   1
  2153. 47    480   1
  2154. 48    481   79
  2155. 49    560   79
  2156. 50    639   79
  2157. 51    718   79
  2158. 52    797   8
  2159. 53    805   1
  2160. 54    806   1
  2161. 55    807   20
  2162. 56    827   4
  2163. 57    831   4
  2164. shell> myisampack station.MYI
  2165. Compressing station.MYI: (1192 records)
  2166. - Calculating statistics
  2167. normal:     20  empty-space:      16  empty-zero:        12  empty-fill:  11
  2168. pre-space:   0  end-space:        12  table-lookups:      5  zero:         7
  2169. Original trees:  57  After join: 17
  2170. - Compressing file
  2171. 87.14%
  2172. shell> ls -l station.*
  2173. -rw-rw-r--   1 monty    my         127874 Apr 17 19:00 station.MYD
  2174. -rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
  2175. -rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm
  2176. shell> myisamchk -dvv station
  2177. MyISAM file:     station
  2178. Isam-version:  2
  2179. Creation time: 1996-03-13 10:08:58
  2180. Recover time:  1997-04-17 19:04:26
  2181. Data records:              1192  Deleted blocks:              0
  2182. Datafile: Parts:           1192  Deleted data:                0
  2183. Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
  2184. Max datafile length:   16777215  Max keyfile length:     131071
  2185. Recordlength:               834
  2186. Record format: Compressed
  2187. table description:
  2188. Key Start Len Index   Type                       Root  Blocksize    Rec/key
  2189. 1   2     4   unique  unsigned long             10240       1024          1
  2190. 2   32    30  multip. text                      54272       1024          1
  2191. Field Start Length Type                         Huff tree  Bits
  2192. 1     1     1      constant                             1     0
  2193. 2     2     4      zerofill(1)                          2     9
  2194. 3     6     4      no zeros, zerofill(1)                2     9
  2195. 4     10    1                                           3     9
  2196. 5     11    20     table-lookup                         4     0
  2197. 6     31    1                                           3     9
  2198. 7     32    30     no endspace, not_always              5     9
  2199. 8     62    35     no endspace, not_always, no empty    6     9
  2200. 9     97    35     no empty                             7     9
  2201. 10    132   35     no endspace, not_always, no empty    6     9
  2202. 11    167   4      zerofill(1)                          2     9
  2203. 12    171   16     no endspace, not_always, no empty    5     9
  2204. 13    187   35     no endspace, not_always, no empty    6     9
  2205. 14    222   4      zerofill(1)                          2     9
  2206. 15    226   16     no endspace, not_always, no empty    5     9
  2207. 16    242   20     no endspace, not_always              8     9
  2208. 17    262   20     no endspace, no empty                8     9
  2209. 18    282   20     no endspace, no empty                5     9
  2210. 19    302   30     no endspace, no empty                6     9
  2211. 20    332   4      always zero                          2     9
  2212. 21    336   4      always zero                          2     9
  2213. 22    340   1                                           3     9
  2214. 23    341   8      table-lookup                         9     0
  2215. 24    349   8      table-lookup                        10     0
  2216. 25    357   8      always zero                          2     9
  2217. 26    365   2                                           2     9
  2218. 27    367   2      no zeros, zerofill(1)                2     9
  2219. 28    369   4      no zeros, zerofill(1)                2     9
  2220. 29    373   4      table-lookup                        11     0
  2221. 30    377   1                                           3     9
  2222. 31    378   2      no zeros, zerofill(1)                2     9
  2223. 32    380   8      no zeros                             2     9
  2224. 33    388   4      always zero                          2     9
  2225. 34    392   4      table-lookup                        12     0
  2226. 35    396   4      no zeros, zerofill(1)               13     9
  2227. 36    400   4      no zeros, zerofill(1)                2     9
  2228. 37    404   1                                           2     9
  2229. 38    405   4      no zeros                             2     9
  2230. 39    409   4      always zero                          2     9
  2231. 40    413   4      no zeros                             2     9
  2232. 41    417   4      always zero                          2     9
  2233. 42    421   4      no zeros                             2     9
  2234. 43    425   4      always zero                          2     9
  2235. 44    429   20     no empty                             3     9
  2236. 45    449   30     no empty                             3     9
  2237. 46    479   1                                          14     4
  2238. 47    480   1                                          14     4
  2239. 48    481   79     no endspace, no empty               15     9
  2240. 49    560   79     no empty                             2     9
  2241. 50    639   79     no empty                             2     9
  2242. 51    718   79     no endspace                         16     9
  2243. 52    797   8      no empty                             2     9
  2244. 53    805   1                                          17     1
  2245. 54    806   1                                           3     9
  2246. 55    807   20     no empty                             3     9
  2247. 56    827   4      no zeros, zerofill(2)                2     9
  2248. 57    831   4      no zeros, zerofill(1)                2     9
  2249. @end example
  2250. The information printed by @code{myisampack} is described below:
  2251. @table @code
  2252. @item normal
  2253. The number of columns for which no extra packing is used.
  2254. @item empty-space
  2255. The number of columns containing
  2256. values that are only spaces; these will occupy 1 bit.
  2257. @item empty-zero
  2258. The number of columns containing
  2259. values that are only binary 0's; these will occupy 1 bit.
  2260. @item empty-fill
  2261. The number of integer columns that don't occupy the full byte range of their
  2262. type; these are changed to a smaller type (for example, an @code{INTEGER}
  2263. column may be changed to @code{MEDIUMINT}).
  2264. @item pre-space
  2265. The number of decimal columns that are stored with leading spaces. In this
  2266. case, each value will contain a count for the number of leading spaces.
  2267. @item end-space
  2268. The number of columns that have a lot of trailing spaces.  In this case, each
  2269. value will contain a count for the number of trailing spaces.
  2270. @item table-lookup
  2271. The column had only a small number of different values, which were
  2272. converted to an @code{ENUM} before Huffman compression.
  2273. @item zero
  2274. The number of columns for which all values are zero.
  2275. @item Original trees
  2276. The initial number of Huffman trees.
  2277. @item After join
  2278. The number of distinct Huffman trees left after joining
  2279. trees to save some header space.
  2280. @end table
  2281. After a table has been compressed, @code{myisamchk -dvv} prints additional
  2282. information about each field:
  2283. @table @code
  2284. @item Type
  2285. The field type may contain the following descriptors:
  2286. @table @code
  2287. @item constant
  2288. All rows have the same value.
  2289. @item no endspace
  2290. Don't store endspace.
  2291. @item no endspace, not_always
  2292. Don't store endspace and don't do end space compression for all values.
  2293. @item no endspace, no empty
  2294. Don't store endspace. Don't store empty values.
  2295. @item table-lookup
  2296. The column was converted to an @code{ENUM}.
  2297. @item zerofill(n)
  2298. The most significant @code{n} bytes in the value are always 0 and are not
  2299. stored.
  2300. @item no zeros
  2301. Don't store zeros.
  2302. @item always zero
  2303. 0 values are stored in 1 bit.
  2304. @end table
  2305. @item Huff tree
  2306. The Huffman tree associated with the field.
  2307. @item Bits
  2308. The number of bits used in the Huffman tree.
  2309. @end table
  2310. After you have run @code{pack_isam}/@code{myisampack} you must run
  2311. @code{isamchk}/@code{myisamchk} to re-create the index.  At this time you
  2312. can also sort the index blocks and create statistics needed for
  2313. the @strong{MySQL} optimizer to work more efficiently:
  2314. @example
  2315. myisamchk -rq --analyze --sort-index table_name.MYI
  2316. isamchk   -rq --analyze --sort-index table_name.ISM
  2317. @end example
  2318. After you have installed the packed table into the @strong{MySQL} database
  2319. directory you should do @code{mysqladmin flush-tables} to force @code{mysqld}
  2320. to start using the new table.
  2321. @cindex installation maintenance
  2322. @cindex maintaining, tables
  2323. @cindex tables, maintaining
  2324. @cindex databases, maintaining
  2325. @cindex @code{mysiamchk}
  2326. @cindex crash, recovery
  2327. @cindex recovery, from crash
  2328. @node Maintenance, Adding functions, Tools, Top
  2329. @chapter Maintaining a MySQL Installation
  2330. @menu
  2331. * Table maintenance::           Table maintenance and crash recovery
  2332. * Maintenance regimen::         Setting up a table maintenance regimen
  2333. * Table-info::                  Getting information about a table
  2334. * Crash recovery::              Using @code{myisamchk} for crash recovery
  2335. * Log file maintenance::        Log file maintenance
  2336. @end menu
  2337. @node Table maintenance, Maintenance regimen, Maintenance, Maintenance
  2338. @section Using @code{myisamchk} for Table Maintenance and Crash Recovery
  2339. Starting with @strong{MySQL} Version 3.23.13, you can check MyISAM
  2340. tables with the @code{CHECK TABLE} command. @xref{CHECK TABLE}.  You can
  2341. repair tables with the @code{REPAIR TABLE} command. @xref{REPAIR TABLE}.
  2342. To check/repair MyISAM tables (@code{.MYI} and @code{.MYD}) you should
  2343. use the @code{myisamchk} utility. To check/repair ISAM tables
  2344. (@code{.ISM} and @code{.ISD}) you should use the @code{isamchk}
  2345. utility. @xref{Table types}.
  2346. In the following text we will talk about @code{myisamchk}, but everything
  2347. also applies to the old @code{isamchk}.
  2348. You can use the @code{myisamchk} utility to get information about your
  2349. database tables, check and repair them, or optimize them.  The following
  2350. sections describe how to invoke @code{myisamchk} (including a
  2351. description of its options), how to set up a table maintenance schedule,
  2352. and how to use @code{myisamchk} to perform its various functions.
  2353. You can, in most cases, also use the command @code{OPTIMIZE TABLES} to
  2354. optimize and repair tables, but this is not as fast or reliable (in case
  2355. of real fatal errors) as @code{myisamchk}.  On the other hand,
  2356. @code{OPTIMIZE TABLE} is easier to use and you don't have to worry about
  2357. flushing tables.
  2358. @xref{OPTIMIZE TABLE, , @code{OPTIMIZE TABLE}}.
  2359. Even that the repair in @code{myisamchk} is quite secure, it's always a
  2360. good idea to make a backup BEFORE doing a repair (or anything that could
  2361. make a lot of changes to a table)
  2362. @menu
  2363. * myisamchk syntax::            @code{myisamchk} invocation syntax
  2364. * myisamchk memory::            @code{myisamchk} memory usage
  2365. @end menu
  2366. @node myisamchk syntax, myisamchk memory, Table maintenance, Table maintenance
  2367. @subsection @code{myisamchk} Invocation Syntax
  2368. @code{myisamchk} is invoked like this:
  2369. @example
  2370. shell> myisamchk [options] tbl_name
  2371. @end example
  2372. The @code{options} specify what you want @code{myisamchk} to do.  They are
  2373. described below.  (You can also get a list of options by invoking
  2374. @code{myisamchk --help}.)  With no options, @code{myisamchk} simply checks your
  2375. table.  To get more information or to tell @code{myisamchk} to take corrective
  2376. action, specify options as described below and in the following sections.
  2377. @code{tbl_name} is the database table you want to check/repair.  If you run
  2378. @code{myisamchk} somewhere other than in the database directory, you must
  2379. specify the path to the file, because @code{myisamchk} has no idea where your
  2380. database is located.  Actually, @code{myisamchk} doesn't care whether or not
  2381. the files you are working on are located in a database directory; you can
  2382. copy the files that correspond to a database table into another location and
  2383. perform recovery operations on them there.
  2384. You can name several tables on the @code{myisamchk} command line if you
  2385. wish.  You can also specify a name as an index file
  2386. name (with the @file{.MYI} suffix), which allows you to specify all
  2387. tables in a directory by using the pattern @file{*.MYI}.
  2388. For example, if you are in a database directory, you can check all the
  2389. tables in the directory like this:
  2390. @example
  2391. shell> myisamchk *.MYI
  2392. @end example
  2393. If you are not in the database directory, you can check all the tables there
  2394. by specifying the path to the directory:
  2395. @example
  2396. shell> myisamchk /path/to/database_dir/*.MYI
  2397. @end example
  2398. You can even check all tables in all databases by specifying a wild card
  2399. with the path to the @strong{MySQL} data directory:
  2400. @example
  2401. shell> myisamchk /path/to/datadir/*/*.MYI
  2402. @end example
  2403. The recommended way to quickly check all tables is:
  2404. @example
  2405. myisamchk --silent --fast /path/to/datadir/*/*.MYI
  2406. isamchk --silent /path/to/datadir/*/*.ISM
  2407. @end example
  2408. If you want to check all tables and repair all tables that are corrupted,
  2409. you can use the following line:
  2410. @example
  2411. myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.MYI
  2412. isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM
  2413. @end example
  2414. The above assumes that you have more than 64 M free.
  2415. Note that if you get an error like:
  2416. @example
  2417. myisamchk: warning: 1 clients is using or hasn't closed the table properly
  2418. @end example
  2419. This means that you are trying to check a table that has been updated by
  2420. the another program (like the mysqld server) that hasn't yet closed
  2421. the file or that has died without closing the file properly.
  2422. If you @code{mysqld} is running, you must force a sync/close of all
  2423. tables with @code{FLUSH TABLES} and ensure that no one is using the
  2424. tables while you are running @code{myisamchk}.  In @strong{MySQL} Version 3.23
  2425. the easiest way to avoid this problem is to use @code{CHECK TABLE}
  2426. instead of @code{myisamchk} to check tables.
  2427. @menu
  2428. * myisamchk general options::   
  2429. * myisamchk check options::     
  2430. * myisamchk repair options::    
  2431. * myisamchk other options::     
  2432. @end menu
  2433. @cindex options, @code{myisamchk}
  2434. @cindex @code{myisamchk}, options
  2435. @node myisamchk general options, myisamchk check options, myisamchk syntax, myisamchk syntax
  2436. @subsubsection General Options for @code{myisamchk}
  2437. @code{myisamchk} supports the following options.
  2438. @table @code
  2439. @item -# or --debug=debug_options
  2440. Output debug log. The @code{debug_options} string often is
  2441. @code{'d:t:o,filename'}.
  2442. @item -? or --help
  2443. Display a help message and exit.
  2444. @item -O var=option, --set-variable var=option
  2445. Set the value of a variable.  The possible variables and their default values
  2446. for myisamchk can be examined with @code{myisamchk --help}:
  2447. @multitable @columnfractions .3 .7
  2448. @item key_buffer_size @tab 523264
  2449. @item read_buffer_size @tab 262136
  2450. @item write_buffer_size @tab 262136
  2451. @item sort_buffer_size @tab 2097144
  2452. @item sort_key_blocks @tab 16
  2453. @item decode_bits @tab 9
  2454. @end multitable
  2455. @code{sort_buffer_size} is used when the keys are reparied by sorting
  2456. keys, which is the normal case when you use @code{--recover}.
  2457. @code{key_buffer_size} is used when you are checking the table with
  2458. @code{--extended-check} or when the keys are repaired by inserting key
  2459. row by row in to the table (like when doing normal inserts). Repairing
  2460. through the key buffer is used in the following cases:
  2461. @itemize @bullet
  2462. @item
  2463. If you use @code{--safe-recover}.
  2464. @item
  2465. If you are using a @code{FULLTEXT} index.
  2466. @item
  2467. If the temporary files needed to sort the keys would be more than twice
  2468. as big as when creating the key file directly.  This is often the case
  2469. when you have big @code{CHAR}, @code{VARCHAR} or @code{TEXT} keys as the
  2470. sort needs to store the whole keys during sorting. If you have lots
  2471. of temporary space and you can force @code{myisamchk} to repair by sorting
  2472. you can use the @code{--sort-recover} option.
  2473. @end itemize
  2474. Reparing through the key buffer takes much less disk space than using
  2475. sorting, but is also much slower.
  2476. If you want a faster repair, set the above variables to about 1/4 of your
  2477. available memory.  You can set both variables to big values, as only one
  2478. of the above buffers will be used at a time.
  2479. @item -s or --silent
  2480. Silent mode.  Write output only when errors occur. You can use @code{-s}
  2481. twice (@code{-ss}) to make @code{myisamchk} very silent.
  2482. @item -v or --verbose
  2483. Verbose mode.  Print more information. This can be used with @code{-d} and
  2484. @code{-e}. Use @code{-v} multiple times (@code{-vv}, @code{-vvv}) for more
  2485. verbosity!
  2486. @item -V or --version
  2487. Print the @code{myisamchk} version and exit.
  2488. @item -w or, --wait
  2489. Instead of giving an error if the table is locked, wait until the table
  2490. is unlocked before continuing.  Note that if you are running @code{mysqld}
  2491. on the table with @code{--skip-locking}, the table can only be locked
  2492. by another @code{myisamchk} command.
  2493. @end table
  2494. @cindex check options, myisamchk
  2495. @cindex tables, checking
  2496. @node myisamchk check options, myisamchk repair options, myisamchk general options, myisamchk syntax
  2497. @subsubsection Check Options for @code{myisamchk}
  2498. @table @code
  2499. @item -c or --check
  2500. Check table for errors. This is the default operation if you are not
  2501. giving @code{myisamchk} any options that override this.
  2502. @item -e or --extend-check
  2503. Check the table VERY thoroughly (which is quite slow if you have many
  2504. indexes).  This option should only be used in extreme cases.  Normally,
  2505. @code{myisamchk} or @code{myisamchk --medium-check} should, in most
  2506. cases, be able to find out if there are any errors in the table.
  2507. If you are using @code{--extended-check} and have much memory, you should
  2508. increase the value of @code{key_buffer_size} a lot!
  2509. @item -F or --fast
  2510. Check only tables that haven't been closed properly.
  2511. @item -C or --check-only-changed
  2512. Check only tables that have changed since the last check.
  2513. @item -f or --force
  2514. Restart @code{myisamchk} with @code{-r} (repair) on the table, if
  2515. @code{myisamchk} finds any errors in the table.
  2516. @item -i or --information
  2517. Print informational statistics about the table that is checked.
  2518. @item -m or --medium-check
  2519. Faster than extended-check, but only finds 99.99% of all errors.
  2520. Should, however, be good enough for most cases.
  2521. @item -U or --update-state
  2522. Store in the @file{.MYI} file when the table was checked and if the table crashed.  This should be used to get full benefit of the
  2523. @code{--check-only-changed} option, but you shouldn't use this
  2524. option if the @code{mysqld} server is using the table and you are
  2525. running @code{mysqld} with @code{--skip-locking}.
  2526. @item -T or --read-only
  2527. Don't mark table as checked. This is useful if you use @code{myisamchk}
  2528. to check a table that is in use by some other application that doesn't
  2529. use locking (like @code{mysqld --skip-locking}).
  2530. @end table
  2531. @cindex repair options, myisamchk
  2532. @cindex files, repairing
  2533. @node myisamchk repair options, myisamchk other options, myisamchk check options, myisamchk syntax
  2534. @subsubsection Repair Options for myisamchk
  2535. The following options are used if you start @code{myisamchk} with
  2536. @code{-r} or @code{-o}:
  2537. @table @code
  2538. @item -D # or --data-file-length=#
  2539. Max length of data file (when re-creating data file when it's 'full').
  2540. @item -e or --extend-check
  2541. Try to recover every possible row from the data file.
  2542. Normally this will also find a lot of garbage rows. Don't use this option
  2543. if you are not totally desperate.
  2544. @item -f or --force
  2545. Overwrite old temporary files (@code{table_name.TMD}) instead of aborting.
  2546. @item -k # or keys-used=#
  2547. If you are using ISAM, tells the ISAM table handler to update only the
  2548. first @code{#} indexes.  If you are using @code{MyISAM}, tells which keys
  2549. to use, where each binary bit stands for one key (first key is bit 0).
  2550. This can be used to get faster inserts!  Deactivated indexes can be
  2551. reactivated by using @code{myisamchk -r}.  keys.
  2552. @item -l or --no-symlinks
  2553. Do not follow symbolic links. Normally @code{myisamchk} repairs the
  2554. table a symlink points at.
  2555. @item -r or --recover
  2556. Can fix almost anything except unique keys that aren't unique
  2557. (which is an extremely unlikely error with ISAM/MyISAM tables).
  2558. If you want to recover a table, this is the option to try first. Only if
  2559. myisamchk reports that the table can't be recovered by @code{-r}, you
  2560. should then try @code{-o}.  (Note that in the unlikely case that @code{-r}
  2561. fails, the data file is still intact.)
  2562. If you have lots of memory, you should increase the size of
  2563. @code{sort_buffer_size}!
  2564. @item  -o or --safe-recover
  2565. Uses an old recovery method (reads through all rows in order and updates
  2566. all index trees based on the found rows); this is a magnitude slower
  2567. than @code{-r}, but can handle a couple of very unlikely cases that
  2568. @code{-r} cannot handle.  This recovery method also uses much less disk
  2569. space than @code{-r}. Normally one should always first repair with
  2570. @code{-r}, and only if this fails use @code{-o}.
  2571. If you have lots of memory, you should increase the size of
  2572. @code{key_buffer_size}!
  2573. @item -n or --sort-recover
  2574. Force @code{myisamchk} to use sorting to resolve the keys even if the
  2575. temporary files should be very big.  This will not have any effect if you have
  2576. fulltext keys in the table.
  2577. @item --character-sets-dir=...
  2578. Directory where character sets are stored.
  2579. @item --set-character-set=name
  2580. Change the character set used by the index
  2581. @item .t or --tmpdir=path
  2582. Path for storing temporary files. If this is not set, @code{myisamchk} will
  2583. use the environment variable @code{TMPDIR} for this.
  2584. @item -q or --quick
  2585. Faster repair by not modifying the data file. One can give a second
  2586. @code{-q} to force @code{myisamchk} to modify the original datafile in case
  2587. of duplicate keys
  2588. @item -u or --unpack
  2589. Unpack file packed with myisampack.
  2590. @end table
  2591. @node myisamchk other options,  , myisamchk repair options, myisamchk syntax
  2592. @subsubsection Other Options for @code{myisamchk}
  2593. Other actions that @code{myisamchk} can do, besides repair and check tables:
  2594. @table @code
  2595. @item -a or --analyze
  2596. Analyze the distribution of keys. This improves join performance by
  2597. enabling the join optimizer to better choose in which order it should
  2598. join the tables and which keys it should use:
  2599. @code{myisamchk --describe --verbose table_name'} or using @code{SHOW KEYS} in
  2600. @strong{MySQL}.
  2601. @item -d or --description
  2602. Prints some information about table.
  2603. @item -A or --set-auto-increment[=value]
  2604. Force auto_increment to start at this or higher value. If no value is
  2605. given, then sets the next auto_increment value to the highest used value
  2606. for the auto key + 1.
  2607. @item -S or --sort-index
  2608. Sort the index tree blocks in high-low order.
  2609. This will optimize seeks and will make table scanning by key faster.
  2610. @item -R or --sort-records=#
  2611. Sorts records according to an index.  This makes your data much more localized
  2612. and may speed up ranged @code{SELECT} and @code{ORDER BY} operations on
  2613. this index. (It may be VERY slow to do a sort the first time!)
  2614. To find out a table's index numbers, use @code{SHOW INDEX}, which shows a
  2615. table's indexes in the same order that @code{myisamchk} sees them.  Indexes are
  2616. numbered beginning with 1.
  2617. @end table
  2618. @cindex memory usage, myisamchk
  2619. @node myisamchk memory,  , myisamchk syntax, Table maintenance
  2620. @subsection @code{myisamchk} Memory Usage
  2621. Memory allocation is important when you run @code{myisamchk}.
  2622. @code{myisamchk} uses no more memory than you specify with the @code{-O}
  2623. options.  If you are going to use @code{myisamchk} on very large files,
  2624. you should first decide how much memory you want it to use.  The default
  2625. is to use only about 3M to fix things.  By using larger values, you can
  2626. get @code{myisamchk} to operate faster.  For example, if you have more
  2627. than 32M RAM, you could use options such as these (in addition to any
  2628. other options you might specify):
  2629. @example
  2630. shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
  2631. @end example
  2632. Using @code{-O sort=16M} should probably be enough for most cases.
  2633. Be aware that @code{myisamchk} uses temporary files in @code{TMPDIR}. If
  2634. @code{TMPDIR} points to a memory file system, you may easily get out of
  2635. memory errors. If this happens, set @code{TMPDIR} to point at some directory
  2636. with more space and restart @code{myisamchk}.
  2637. When repairing, @code{myisamchk} will also nead a lot of disk space:
  2638. @itemize @bullet
  2639. @item
  2640. Double the size of the record file (the original one and a copy).  This
  2641. space is not needed if one does a repair with @code{--quick}, as in this
  2642. case only the index file will be re-created.  This space is needed on the
  2643. same disk as the original record file!
  2644. @item
  2645. Space for the new index file that replaces the old one. The old
  2646. index file is truncated at start, so one usually ignore this space.
  2647. This space is needed on the same disk as the original index file!
  2648. @item
  2649. When using @code{--recover} or @code{--sort-recover}
  2650. (but not when using @code{--safe-recover}, you will need space for a
  2651. sort buffer for:
  2652. @code{(largest_key + row_pointer_length)*number_of_rows * 2}.
  2653. You can check the length of the keys and the row_pointer_length with
  2654. @code{myisamchk -dv table}.
  2655. This space is allocated on the temporary disk (specified by @code{TMPDIR} or
  2656. @code{--tmpdir=#}).
  2657. @end itemize
  2658. If you have a problem with disk space during repair, you can try to use
  2659. @code{--safe-recover} instead of @code{--recover}.
  2660. @cindex maintaining, tables
  2661. @cindex tables, maintenance regimen
  2662. @node Maintenance regimen, Table-info, Table maintenance, Maintenance
  2663. @section Setting Up a Table Maintenance Regimen
  2664. Starting with @strong{MySQL} Version 3.23.13, you can check MyISAM
  2665. tables with the @code{CHECK TABLE} command. @xref{CHECK TABLE}.  You can
  2666. repair tables with the @code{REPAIR TABLE} command. @xref{REPAIR TABLE}.
  2667. It is a good idea to perform table checks on a regular basis rather than
  2668. waiting for problems to occur.  For maintenance purposes, you can use
  2669. @code{myisamchk -s} to check tables.  The @code{-s} option (short for
  2670. @code{--silent}) causes @code{myisamchk} to run in silent mode, printing
  2671. messages only when errors occur.
  2672. @tindex .pid (process ID) file
  2673. It's also a good idea to check tables when the server starts up.
  2674. For example, whenever the machine has done a reboot in the middle of an
  2675. update, you usually need to check all the tables that could have been
  2676. affected. (This is an ``expected crashed table''.) You could add a test to
  2677. @code{safe_mysqld} that runs @code{myisamchk} to check all tables that have
  2678. been modified during the last 24 hours if there is an old @file{.pid}
  2679. (process ID) file left after a reboot.  (The @file{.pid} file is created by
  2680. @code{mysqld} when it starts up and removed when it terminates normally.  The
  2681. presence of a @file{.pid} file at system startup time indicates that
  2682. @code{mysqld} terminated abnormally.)
  2683. An even better test would be to check any table whose last-modified time
  2684. is more recent than that of the @file{.pid} file.
  2685. You should also check your tables regularly during normal system
  2686. operation.  At MySQL AB, we run a @code{cron} job to check all our important
  2687. tables once a week, using a line like this in a @file{crontab} file:
  2688. @example
  2689. 35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI
  2690. @end example
  2691. This prints out information about crashed tables so we can examine and repair
  2692. them when needed.
  2693. As we haven't had any unexpectedly crashed tables (tables that become
  2694. corrupted for reasons other than hardware trouble)
  2695. for a couple of years now (this is really true), once a week is
  2696. more than enough for us.
  2697. We recommend that to start with, you execute @code{myisamchk -s} each
  2698. night on all tables that have been updated during the last 24 hours,
  2699. until you come to trust @strong{MySQL} as much as we do.
  2700. @cindex tables, defragment
  2701. Normally you don't need to maintain MySQL tables that much.  If you are
  2702. changing tables with dynamic size rows (tables with @code{VARCHAR},
  2703. @code{BLOB} or @code{TEXT} columns) or have tables with many deleted rows
  2704. you may want to from time to time (once a month?) defragment/reclaim space
  2705. from the tables.
  2706. You can do this by using @code{OPTIMIZE TABLE} on the tables in question or
  2707. if you can take the @code{mysqld} server down for a while do:
  2708. @example
  2709. isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
  2710. myisamchk -r --silent --sort-index  -O sort_buffer_size=16M */*.MYI
  2711. @end example
  2712. @cindex tables, information
  2713. @node Table-info, Crash recovery, Maintenance regimen, Maintenance
  2714. @section Getting Information About a Table
  2715. To get a description of a table or statistics about it, use the commands shown
  2716. below. We explain some of the information in more detail later:
  2717. @table @code
  2718. @item myisamchk -d tbl_name
  2719. Runs @code{myisamchk} in ``describe mode'' to produce a description of
  2720. your table. If you start the @strong{MySQL} server using the
  2721. @code{--skip-locking} option, @code{myisamchk} may report an error for a
  2722. table that is updated while it runs.  However, because @code{myisamchk}
  2723. doesn't change the table in describe mode, there isn't any risk of
  2724. destroying data.
  2725. @item myisamchk -d -v tbl_name
  2726. To produce more information about what @code{myisamchk} is doing, add @code{-v}
  2727. to tell it to run in verbose mode.
  2728. @item myisamchk -eis tbl_name
  2729. Shows only the most important information from a table. It is slow because it
  2730. must read the whole table.
  2731. @item myisamchk -eiv tbl_name
  2732. This is like @code{-eis}, but tells you what is being done.
  2733. @end table
  2734. @cindex examples, @code{myisamchk} output
  2735. @cindex @code{myisamchk}, example output
  2736. Example of @code{myisamchk -d} output:
  2737. @example
  2738. MyISAM file:     company.MYI
  2739. Record format:   Fixed length
  2740. Data records:    1403698  Deleted blocks:         0
  2741. Recordlength:    226
  2742. table description:
  2743. Key Start Len Index   Type
  2744. 1   2     8   unique  double
  2745. 2   15    10  multip. text packed stripped
  2746. 3   219   8   multip. double
  2747. 4   63    10  multip. text packed stripped
  2748. 5   167   2   multip. unsigned short
  2749. 6   177   4   multip. unsigned long
  2750. 7   155   4   multip. text
  2751. 8   138   4   multip. unsigned long
  2752. 9   177   4   multip. unsigned long
  2753.     193   1           text
  2754. @end example
  2755. Example of @code{myisamchk -d -v} output:
  2756. @example
  2757. MyISAM file:         company
  2758. Record format:       Fixed length
  2759. File-version:        1
  2760. Creation time:       1999-10-30 12:12:51