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

MySQL数据库

开发平台:

Visual C++

  1. Recover time:        1999-10-31 19:13:01
  2. Status:              checked
  3. Data records:           1403698  Deleted blocks:              0
  4. Datafile parts:         1403698  Deleted data:                0
  5. Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
  6. Max datafile length: 3791650815  Max keyfile length: 4294967294
  7. Recordlength:               226
  8. table description:
  9. Key Start Len Index   Type                  Rec/key     Root Blocksize
  10. 1   2     8   unique  double                      1 15845376      1024
  11. 2   15    10  multip. text packed stripped        2 25062400      1024
  12. 3   219   8   multip. double                     73 40907776      1024
  13. 4   63    10  multip. text packed stripped        5 48097280      1024
  14. 5   167   2   multip. unsigned short           4840 55200768      1024
  15. 6   177   4   multip. unsigned long            1346 65145856      1024
  16. 7   155   4   multip. text                     4995 75090944      1024
  17. 8   138   4   multip. unsigned long              87 85036032      1024
  18. 9   177   4   multip. unsigned long             178 96481280      1024
  19.     193   1           text
  20. @end example
  21. Example of @code{myisamchk -eis} output:
  22. @example
  23. Checking MyISAM file: company
  24. Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  25. Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
  26. Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  27. Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
  28. Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  29. Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  30. Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  31. Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  32. Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
  33. Total:    Keyblocks used:  98%  Packed:   17%
  34. Records:          1403698    M.recordlength:     226   Packed:             0%
  35. Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
  36. Record blocks:    1403698    Delete blocks:        0
  37. Recorddata:     317235748    Deleted data:         0
  38. Lost space:             0    Linkdata:             0
  39. User time 1626.51, System time 232.36
  40. Maximum resident set size 0, Integral resident set size 0
  41. Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
  42. Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  43. Voluntary context switches 639, Involuntary context switches 28966
  44. @end example
  45. Example of @code{myisamchk -eiv} output:
  46. @example
  47. Checking MyISAM file: company
  48. Data records: 1403698   Deleted blocks:       0
  49. - check file-size
  50. - check delete-chain
  51. block_size 1024:
  52. index  1:
  53. index  2:
  54. index  3:
  55. index  4:
  56. index  5:
  57. index  6:
  58. index  7:
  59. index  8:
  60. index  9:
  61. No recordlinks
  62. - check index reference
  63. - check data record references index: 1
  64. Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  65. - check data record references index: 2
  66. Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
  67. - check data record references index: 3
  68. Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
  69. - check data record references index: 4
  70. Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
  71. - check data record references index: 5
  72. Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  73. - check data record references index: 6
  74. Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  75. - check data record references index: 7
  76. Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  77. - check data record references index: 8
  78. Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
  79. - check data record references index: 9
  80. Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
  81. Total:    Keyblocks used:   9%  Packed:   17%
  82. - check records and index references
  83. [LOTS OF ROW NUMBERS DELETED]
  84. Records:          1403698    M.recordlength:     226   Packed:             0%
  85. Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
  86. Record blocks:    1403698    Delete blocks:        0
  87. Recorddata:     317235748    Deleted data:         0
  88. Lost space:             0    Linkdata:             0
  89. User time 1639.63, System time 251.61
  90. Maximum resident set size 0, Integral resident set size 0
  91. Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
  92. Blocks in 4 out 0, Messages in 0 out 0, Signals 0
  93. Voluntary context switches 10604, Involuntary context switches 122798
  94. @end example
  95. Here are the sizes of the data and index files for the table used in the
  96. preceding examples:
  97. @example
  98. -rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 company.MYD
  99. -rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.MYM
  100. @end example
  101. Explanations for the types of information @code{myisamchk} produces are
  102. given below.  The ``keyfile'' is the index file.  ``Record'' and ``row''
  103. are synonymous:
  104. @table @code
  105. @item ISAM file
  106. Name of the ISAM (index) file.
  107. @item Isam-version
  108. Version of ISAM format. Currently always 2.
  109. @item Creation time
  110. When the data file was created.
  111. @item Recover time
  112. When the index/data file was last reconstructed.
  113. @item Data records
  114. How many records are in the table.
  115. @item Deleted blocks
  116. How many deleted blocks still have reserved space.
  117. You can optimize your table to minimize this space.
  118. @xref{Optimization}.
  119. @item Datafile: Parts
  120. For dynamic record format, this indicates how many data blocks there are. For
  121. an optimized table without fragmented records, this is the same as @code{Data
  122. records}.
  123. @item Deleted data
  124. How many bytes of non-reclaimed deleted data there are.
  125. You can optimize your table to minimize this space.
  126. @xref{Optimization}.
  127. @item Datafile pointer
  128. The size of the data file pointer, in bytes. It is usually 2, 3, 4, or 5
  129. bytes. Most tables manage with 2 bytes, but this cannot be controlled
  130. from @strong{MySQL} yet. For fixed tables, this is a record address. For
  131. dynamic tables, this is a byte address.
  132. @item Keyfile pointer
  133. The size of the index file pointer, in bytes. It is usually 1, 2, or 3
  134. bytes. Most tables manage with 2 bytes, but this is calculated
  135. automatically by @strong{MySQL}. It is always a block address.
  136. @item Max datafile length
  137. How long the table's data file (@code{.MYD} file) can become, in bytes.
  138. @item Max keyfile length
  139. How long the table's key file (@code{.MYI} file) can become, in bytes.
  140. @item Recordlength
  141. How much space each record takes, in bytes.
  142. @item Record format
  143. The format used to store table rows.
  144. The examples shown above use @code{Fixed length}.
  145. Other possible values are @code{Compressed} and @code{Packed}.
  146. @item table description
  147. A list of all keys in the table. For each key, some low-level information
  148. is presented:
  149. @table @code
  150. @item Key
  151. This key's number.
  152. @item Start
  153. Where in the record this index part starts.
  154. @item Len
  155. How long this index part is. For packed numbers, this should always be
  156. the full length of the column. For strings, it may be shorter than the full
  157. length of the indexed column, because you can index a prefix of a string
  158. column.
  159. @item Index
  160. @code{unique} or @code{multip.} (multiple). Indicates whether or not one value
  161. can exist multiple times in this index.
  162. @item Type
  163. What data-type this index part has. This is an ISAM data-type
  164. with the options @code{packed}, @code{stripped} or @code{empty}.
  165. @item Root
  166. Address of the root index block.
  167. @item Blocksize
  168. The size of each index block. By default this is 1024, but the value may be
  169. changed at compile time.
  170. @item Rec/key
  171. This is a statistical value used by the optimizer. It tells how many
  172. records there are per value for this key. A unique key always has a
  173. value of 1. This may be updated after a table is loaded (or greatly
  174. changed) with @code{myisamchk -a}. If this is not updated at all, a default
  175. value of 30 is given.
  176. @end table
  177. @item
  178. In the first example above, the 9th key is a multi-part key with two parts.
  179. @item Keyblocks used
  180. What percentage of the keyblocks are used. Because the table used in the
  181. examples had just been reorganized with @code{myisamchk}, the values are very
  182. high (very near the theoretical maximum).
  183. @item Packed
  184. @strong{MySQL} tries to pack keys with a common suffix. This can only be used
  185. for @code{CHAR}/@code{VARCHAR}/@code{DECIMAL} keys. For long strings like
  186. names, this can significantly reduce the space used. In the third example
  187. above, the 4th key is 10 characters long and a 60% reduction in space is
  188. achieved.
  189. @item Max levels
  190. How deep the B-tree for this key is. Large tables with long keys get high
  191. values.
  192. @item Records
  193. How many rows are in the table.
  194. @item M.recordlength
  195. The average record length. For tables with fixed-length records, this is the
  196. exact record length.
  197. @item Packed
  198. @strong{MySQL} strips spaces from the end of strings. The @code{Packed}
  199. value indicates the percentage of savings achieved by doing this.
  200. @item Recordspace used
  201. What percentage of the data file is used.
  202. @item Empty space
  203. What percentage of the data file is unused.
  204. @item Blocks/Record
  205. Average number of blocks per record (that is, how many links a fragmented
  206. record is composed of). This is always 1 for fixed-format tables. This value
  207. should stay as close to 1.0 as possible. If it gets too big, you can
  208. reorganize the table with @code{myisamchk}.
  209. @xref{Optimization}.
  210. @item Recordblocks
  211. How many blocks (links) are used. For fixed format, this is the same as the number
  212. of records.
  213. @item Deleteblocks
  214. How many blocks (links) are deleted.
  215. @item Recorddata
  216. How many bytes in the data file are used.
  217. @item Deleted data
  218. How many bytes in the data file are deleted (unused).
  219. @item Lost space
  220. If a record is updated to a shorter length, some space is lost. This is
  221. the sum of all such losses, in bytes.
  222. @item Linkdata
  223. When the dynamic table format is used, record fragments are linked with
  224. pointers (4 to 7 bytes each). @code{Linkdata} is the sum of the amount of
  225. storage used by all such pointers.
  226. @end table
  227. If a table has been compressed with @code{myisampack}, @code{myisamchk
  228. -d} prints additional information about each table column.  See
  229. @ref{myisampack, , @code{myisampack}}, for an example of this
  230. information and a description of what it means.
  231. @cindex crash, recovery
  232. @cindex recovery, from crash
  233. @node Crash recovery, Log file maintenance, Table-info, Maintenance
  234. @section Using @code{myisamchk} for Crash Recovery
  235. If you run @code{mysqld} with @code{--skip-locking} (which is the default on
  236. some systems, like Linux), you can't reliably use @code{myisamchk} to
  237. check a table when @code{mysqld} is using the same table.  If you
  238. can be sure that no one is accessing the tables through @code{mysqld}
  239. while you run @code{myisamchk}, you only have to do @code{mysqladmin
  240. flush-tables} before you start checking the tables.  If you can't
  241. guarantee the above, then you must take down @code{mysqld} while you
  242. check the tables.  If you run @code{myisamchk} while @code{mysqld} is updating
  243. the tables, you may get a warning that a table is corrupt even if it
  244. isn't.
  245. If you are not using @code{--skip-locking}, you can use @code{myisamchk}
  246. to check tables at any time.  While you do this, all clients that try
  247. to update the table will wait until @code{myisamchk} is ready before
  248. continuing.
  249. If you use @code{myisamchk} to repair or optimize tables, you
  250. @strong{MUST} always ensure that the @code{mysqld} server is not using
  251. the table (this also applies if you are using @code{--skip-locking}).
  252. If you don't take down @code{mysqld} you should at least do a
  253. @code{mysqladmin flush-tables} before you run @code{myisamchk}.
  254. The file format that @strong{MySQL} uses to store data has been extensively
  255. tested, but there are always external circumstances that may cause database
  256. tables to become corrupted:
  257. @itemize @bullet
  258. @item
  259. The @code{mysqld} process being killed in the middle of a write.
  260. @item
  261. Unexpected shutdown of the computer (for example, if the computer is turned
  262. off).
  263. @item
  264. A hardware error.
  265. @end itemize
  266. This chapter describes how to check for and deal with data corruption
  267. in @strong{MySQL} databases.  If your tables get corrupted a lot you should
  268. try to find the reason for this! @xref{Debugging server}.
  269. When performing crash recovery, it is important to understand that each table
  270. @code{tbl_name} in a database corresponds to three files in the database
  271. directory:
  272. @multitable @columnfractions .2 .8
  273. @item @strong{File} @tab @strong{Purpose}
  274. @item @file{tbl_name.frm} @tab Table definition (form) file
  275. @item @file{tbl_name.MYD} @tab Data file
  276. @item @file{tbl_name.MYI} @tab Index file
  277. @end multitable
  278. Each of these three file types is subject to corruption in various ways, but
  279. problems occur most often in data files and index files.
  280. @code{myisamchk} works by creating a copy of the @file{.MYD} (data) file
  281. row by row. It ends the repair stage by removing the old @file{.MYD}
  282. file and renaming the new file to the original file name.  If you use
  283. @code{--quick}, @code{myisamchk} does not create a temporary @file{.MYD}
  284. file, but instead assumes that the @file{.MYD} file is correct and only
  285. generates a new index file without touching the @file{.MYD} file. This
  286. is safe, because @code{myisamchk} automatically detects if the
  287. @file{.MYD} file is corrupt and aborts the repair in this case.  You can
  288. also give two @code{--quick} options to @code{myisamchk}.  In this case,
  289. @code{myisamchk} does not abort on some errors (like duplicate key) but
  290. instead tries to resolve them by modifying the @file{.MYD}
  291. file. Normally the use of two @code{--quick} options is useful only if
  292. you have too little free disk space to perform a normal repair.  In this
  293. case you should at least make a backup before running @code{myisamchk}.
  294. @menu
  295. * Check::                       How to check tables for errors
  296. * Repair::                      How to repair tables
  297. * Optimization::                Table optimization
  298. @end menu
  299. @cindex checking, tables for errors
  300. @cindex tables, error checking
  301. @cindex errors, checking tables for
  302. @node Check, Repair, Crash recovery, Crash recovery
  303. @subsection How to Check Tables for Errors
  304. To check a MyISAM table, use the following commands:
  305. @table @code
  306. @item myisamchk tbl_name
  307. This finds 99.99% of all errors. What it can't find is corruption that
  308. involves @strong{ONLY} the data file (which is very unusual). If you want
  309. to check a table, you should normally run @code{myisamchk} without options or
  310. with either the @code{-s} or @code{--silent} option.
  311. @item myisamchk -m tbl_name
  312. This finds 99.999% of all errors. It checks first all index entries for errors and
  313. then it reads through all rows. It calculates a checksum for all keys in
  314. the rows and verifies that they checksum matches the checksum for the keys
  315. in the index tree.
  316. @item myisamchk -e tbl_name
  317. This does a complete and thorough check of all data (@code{-e} means
  318. ``extended check''). It does a check-read of every key for each row to verify
  319. that they indeed point to the correct row.  This may take a LONG time on a
  320. big table with many keys.  @code{myisamchk} will normally stop after the first
  321. error it finds. If you want to obtain more information, you can add the
  322. @code{--verbose} (@code{-v}) option.  This causes @code{myisamchk} to keep
  323. going, up through a maximum of 20 errors.  In normal usage, a simple
  324. @code{myisamchk} (with no arguments other than the table name) is sufficient.
  325. @item myisamchk -e -i tbl_name
  326. Like the previous command, but the @code{-i} option tells @code{myisamchk} to
  327. print some informational statistics, too.
  328. @end table
  329. @cindex tables, repairing
  330. @cindex repairing, tables
  331. @node Repair, Optimization, Check, Crash recovery
  332. @subsection How to Repair Tables
  333. In the following section we only talk about using @code{myisamchk} on
  334. @code{MyISAM} tables (extensions @code{.MYI} and @code{.MYD}).  If you
  335. are using @code{ISAM} tables (extensions @code{.ISM} and @code{.ISD}),
  336. you should use @code{isamchk} instead.
  337. Starting with @strong{MySQL} Version 3.23.14, you can repair MyISAM
  338. tables with the @code{REPAIR TABLE} command. @xref{REPAIR TABLE}.
  339. The symptoms of a corrupted table include queries that abort unexpectedly
  340. and observable errors such as these:
  341. @itemize @bullet
  342. @item
  343. @file{tbl_name.frm} is locked against change
  344. @item
  345. Can't find file @file{tbl_name.MYI} (Errcode: ###)
  346. @item
  347. Unexpected end of file
  348. @item
  349. Record file is crashed
  350. @item
  351. Got error ### from table handler
  352. To get more information about the error you can do @code{perror
  353. ###}. Here is the most common errors that indicates a problem with the
  354. table:
  355. @example
  356. shell> perror 126 127 132 134 135 136 141 144 145
  357. 126 = Index file is crashed / Wrong file format
  358. 127 = Record-file is crashed
  359. 132 = Old database file
  360. 134 = Record was already deleted (or record file crashed)
  361. 135 = No more room in record file
  362. 136 = No more room in index file
  363. 141 = Duplicate unique key or constraint on write or update
  364. 144 = Table is crashed and last repair failed
  365. 145 = Table was marked as crashed and should be repaired
  366. @end example
  367. Note that error 135, no more room in record file, is not a error that
  368. can be fixed by a simple repair. In this case you have to do:
  369. @itemize @bullet
  370. @item
  371. @code{CREATE TABLE ...} for the table with proper @code{MAX_ROWS} and
  372. @code{AVG_ROW_LENGTH} values. @xref{CREATE TABLE}.
  373. @item
  374. Copy the data over from the old table with @code{INSERT INTO new_table
  375. SELECT * from old_table}.
  376. @item
  377. Rename the old table to the new table:
  378. @code{RENAME old_table to tmp_table, new_table to old_table}
  379. @item
  380. Delete the old table: @code{DROP TABLE tmp_table}.
  381. @end itemize
  382. @end itemize
  383. In these cases, you must repair your tables. @code{myisamchk}
  384. can usually detect and fix most things that go wrong.
  385. The repair process involves up to four stages, described below. Before you
  386. begin, you should @code{cd} to the database directory and check the
  387. permissions of the table files. Make sure they are readable by the Unix user
  388. that @code{mysqld} runs as (and to you, because you need to access the files
  389. you are checking).  If it turns out you need to modify files, they must also
  390. be writable by you.
  391. If you are using @strong{MySQL} Version 3.23.16 and above, you can (and should) use the
  392. @code{CHECK} and @code{REPAIR} commands to check and repair @code{MyISAM}
  393. tables. @xref{CHECK TABLE}. @xref{REPAIR TABLE}.
  394. The manual section about table maintenance includes the options to
  395. @code{isamchk}/@code{myisamchk}. @xref{Table maintenance}.
  396. The following section is for the cases where the above command fails or
  397. if you want to use the extended features that @code{isamchk}/@code{myisamchk} provides.
  398. If you are going to repair a table from the command line, you must first
  399. take down the @code{mysqld} server. Note that when you do
  400. @code{mysqladmin shutdown} on a remote server, the @code{mysqld} server
  401. will still be alive for a while after @code{mysqladmin} returns, until
  402. all queries are stopped and all keys have been flushed to disk.
  403. @noindent
  404. @strong{Stage 1: Checking your tables}
  405. Run @code{myisamchk *.MYI} or @code{myisamchk -e *.MYI} if you have
  406. more time.  Use the @code{-s} (silent) option to suppress unnecessary
  407. information.
  408. If the mysqld server is done you should use the --update option to tell
  409. @code{myisamchk} to mark the table as 'checked'.
  410. You have to repair only those tables for which @code{myisamchk} announces an
  411. error.  For such tables, proceed to Stage 2.
  412. If you get weird errors when checking (such as @code{out of
  413. memory} errors), or if @code{myisamchk} crashes, go to Stage 3.
  414. @noindent
  415. @strong{Stage 2: Easy safe repair}
  416. NOTE: If you want repairing to go much faster, you should add: @code{-O
  417. sort_buffer=# -O key_buffer=#} (where # is about 1/4 of the available
  418. memory) to all @code{isamchk/myisamchk} commands.
  419. First, try @code{myisamchk -r -q tbl_name} (@code{-r -q} means ``quick
  420. recovery mode''). This will attempt to repair the index file without
  421. touching the data file.  If the data file contains everything that it
  422. should and the delete links point at the correct locations within the
  423. data file, this should work, and the table is fixed. Start repairing the
  424. next table.  Otherwise, use the following procedure:
  425. @enumerate
  426. @item
  427. Make a backup of the data file before continuing.
  428. @item
  429. Use @code{myisamchk -r tbl_name} (@code{-r} means ``recovery mode''). This will
  430. remove incorrect records and deleted records from the data file and
  431. reconstruct the index file.
  432. @item
  433. If the preceding step fails, use @code{myisamchk --safe-recover tbl_name}.
  434. Safe recovery mode uses an old recovery method that handles a few cases that
  435. regular recovery mode doesn't (but is slower).
  436. @end enumerate
  437. If you get weird errors when repairing (such as @code{out of
  438. memory} errors), or if @code{myisamchk} crashes, go to Stage 3.
  439. @noindent
  440. @strong{Stage 3: Difficult repair}
  441. You should only reach this stage if the first 16K block in the index file is
  442. destroyed or contains incorrect information, or if the index file is
  443. missing.  In this case, it's necessary to create a new index file. Do so as
  444. follows:
  445. @enumerate
  446. @item
  447. Move the data file to some safe place.
  448. @item
  449. Use the table description file to create new (empty) data and index files:
  450. @example
  451. shell> mysql db_name
  452. mysql> SET AUTOCOMMIT=1;
  453. mysql> TRUNCATE TABLE table_name;
  454. mysql> quit
  455. @end example
  456. If your SQL version doesn't have @code{TRUNCATE TABLE}, use @code{DELETE FROM
  457. table_name} instead.
  458. @item
  459. Copy the old data file back onto the newly created data file.
  460. (Don't just move the old file back onto the new file; you want to retain
  461. a copy in case something goes wrong.)
  462. @end enumerate
  463. Go back to Stage 2.  @code{myisamchk -r -q} should work now.  (This shouldn't
  464. be an endless loop.)
  465. @noindent
  466. @strong{Stage 4: Very difficult repair}
  467. You should reach this stage only if the description file has also
  468. crashed. That should never happen, because the description file isn't changed
  469. after the table is created:
  470. @enumerate
  471. @item
  472. Restore the description file from a backup and go back to Stage 3.  You can
  473. also restore the index file and go back to Stage 2.  In the latter case, you
  474. should start with @code{myisamchk -r}.
  475. @item
  476. If you don't have a backup but know exactly how the table was created, create
  477. a copy of the table in another database.  Remove the new data file, then move
  478. the description and index files from the other database to your crashed
  479. database.  This gives you new description and index files, but leaves
  480. the data file alone.  Go back to Stage 2 and attempt to reconstruct
  481. the index file.
  482. @end enumerate
  483. @cindex tables, optimizing
  484. @cindex optimizing, tables
  485. @node Optimization,  , Repair, Crash recovery
  486. @subsection Table Optimization
  487. To coalesce fragmented records and eliminate wasted space resulting from
  488. deleting or updating records, run @code{myisamchk} in recovery mode:
  489. @example
  490. shell> myisamchk -r tbl_name
  491. @end example
  492. You can optimize a table in the same way using the SQL @code{OPTIMIZE TABLE}
  493. statement.  @code{OPTIMIZE TABLE} does a repair of the table, a key
  494. analyzes and also sorts the index tree to give faster key lookups.
  495. There is also no possibility of unwanted interaction between a utility
  496. and the server, because the server does all the work when you use
  497. @code{OPTIMIZE TABLE}. @xref{OPTIMIZE TABLE}.
  498. @code{myisamchk} also has a number of other options you can use to improve
  499. the performance of a table:
  500. @table @code
  501. @item -S, --sort-index
  502. @item -R index_num, --sort-records=index_num
  503. @item -a, --analyze
  504. @end table
  505. For a full description of the option, see @xref{myisamchk syntax}.
  506. @cindex files, log
  507. @cindex maintaining, log files
  508. @cindex log files, maintaining
  509. @node Log file maintenance,  , Crash recovery, Maintenance
  510. @section Log file Maintenance
  511. @strong{MySQL} has a lot of log files which make it easy to see what is
  512. going. @xref{Log files}. One must however from time to time clean up
  513. after @code{MysQL} to ensure that the logs doesn't take up too much disk
  514. space.
  515. When using @strong{MySQL} with log files, you will, from time to time,
  516. want to remove/backup old log files and tell @strong{MySQL} to start
  517. logging on new files.  @xref{Backup}.
  518. On a Linux (@code{Redhat}) installation, you can use the
  519. @code{mysql-log-rotate} script for this. If you installed @strong{MySQL}
  520. from an RPM distribution, the script should have been installed
  521. automatically.  Note that you should be careful with this if you are using
  522. the log for replication!
  523. On other systems you must install a short script yourself that you
  524. start from @code{cron} to handle log files.
  525. You can force @strong{MySQL} to start using new log files by using
  526. @code{mysqladmin flush-logs} or by using the SQL command @code{FLUSH LOGS}.
  527. If you are using @strong{MySQL} Version 3.21 you must use @code{mysqladmin refresh}.
  528. The above command does the following:
  529. @itemize @bullet
  530. @item
  531. If standard logging (@code{--log}) or slow query logging
  532. (@code{--log-slow-queries}) is used, closes and reopens the log file.
  533. (@file{mysql.log} and @file{`hostname`-slow.log} as default).
  534. @item
  535. If update logging (@code{--log-update}) is used, closes the update log and
  536. opens a new log file with a higher sequence number.
  537. @end itemize
  538. If you are using only an update log, you only have to flush the logs and then
  539. move away the old update log files to a backup.
  540. If you are using the normal logging, you can do something like:
  541. @example
  542. shell> cd mysql-data-directory
  543. shell> mv mysql.log mysql.old
  544. shell> mysqladmin flush-logs
  545. @end example
  546. and then take a backup and remove @file{mysql.old}.
  547. @cindex functions, new
  548. @cindex adding, new functions
  549. @cindex user-defined functions, adding
  550. @cindex UDFs, defined
  551. @cindex functions, user-defined
  552. @node Adding functions, Adding procedures, Maintenance, Top
  553. @chapter Adding New Functions to MySQL
  554. There are two ways to add new functions to @strong{MySQL}:
  555. @itemize @bullet
  556. @item You can add the function through the user-definable function (UDF)
  557. interface.  User-definable functions are added and removed dynamically using
  558. the @code{CREATE FUNCTION} and @code{DROP FUNCTION} statements.
  559. @xref{CREATE FUNCTION, , @code{CREATE FUNCTION}}.
  560. @item You can add the function as a native (built in) @strong{MySQL} function.
  561. Native functions are compiled into the @code{mysqld} server and become
  562. available on a permanent basis.
  563. @end itemize
  564. Each method has advantages and disadvantages:
  565. @itemize @bullet
  566. @item
  567. If you write a user-definable function, you must install the object file
  568. in addition to the server itself.  If you compile your function into the
  569. server, you don't need to do that.
  570. @item
  571. You can add UDFs to a binary @strong{MySQL} distribution.  Native functions
  572. require you to modify a source distribution.
  573. @item
  574. If you upgrade your @strong{MySQL} distribution, you can continue to use your
  575. previously installed UDFs.  For native functions, you must repeat your
  576. modifications each time you upgrade.
  577. @end itemize
  578. Whichever method you use to add new functions, they may be used just like
  579. native functions such as @code{ABS()} or @code{SOUNDEX()}.
  580. @menu
  581. * Adding UDF::                  Adding a new user-definable function
  582. * Adding native function::      Adding a new native function
  583. @end menu
  584. @cindex adding, user-definable functions
  585. @cindex user-defined functions, adding
  586. @cindex functions, user-definable, adding
  587. @node Adding UDF, Adding native function, Adding functions, Adding functions
  588. @section Adding a New User-definable Function
  589. @menu
  590. * UDF calling sequences::       UDF calling sequences
  591. * UDF arguments::               Argument processing
  592. * UDF return values::           Return values and error handling
  593. * UDF compiling::               Compiling and installing user-definable functions
  594. @end menu
  595. For the UDF mechanism to work, functions must be written in C or C++ and your
  596. operating system must support dynamic loading.  The @strong{MySQL} source
  597. distribution includes a file @file{sql/udf_example.cc} that defines 5 new
  598. functions.  Consult this file to see how UDF calling conventions work.
  599. For mysqld to be able to use UDF functions, you should configure MySQL
  600. with @code{--with-mysqld-ldflags=-rdynamic} The reason is that to on
  601. many platforms you can load a dynamic library (with @code{dlopen()})
  602. from a static linked program, which you would get if you are using
  603. @code{--with-mysqld-ldflags=-all-static} If you want to use an UDF that
  604. needs to access symbols from mysqld (like the @code{methaphone} example
  605. in @file{sql/udf_example.cc} that uses @code{default_charset_info}), you must
  606. link the program with @code{-rdynamic}.  (see @code{man dlopen}).
  607. For each function that you want to use in SQL statements, you should define
  608. corresponding C (or C++) functions.  In the discussion below, the name
  609. ``xxx'' is used for an example function name.  To distinquish between SQL and
  610. C/C++ usage, @code{XXX()} (uppercase) indicates a SQL function call, and
  611. @code{xxx()} (lowercase) indicates a C/C++ function call.
  612. The C/C++ functions that you write to implement the inferface for
  613. @code{XXX()} are:
  614. @table @asis
  615. @item @code{xxx()} (required)
  616. The main function.  This is where the function result is computed.
  617. The correspondence between the SQL type and return type of your C/C++
  618. function is shown below:
  619. @multitable @columnfractions .2 .8
  620. @item @strong{SQL type} @tab @strong{C/C++ type}
  621. @item @code{STRING}     @tab @code{char *}
  622. @item @code{INTEGER}    @tab @code{long long}
  623. @item @code{REAL}       @tab @code{double}
  624. @end multitable
  625. @item @code{xxx_init()} (optional)
  626. The initialization function for @code{xxx()}.  It can be used to:
  627. @itemize @bullet
  628. @item
  629. Check the number of arguments to @code{XXX()}.
  630. @item
  631. Check that the arguments are of a required type or, alternatively,
  632. tell @strong{MySQL} to coerce arguments to the types you want when
  633. the main function is called.
  634. @item
  635. Allocate any memory required by the main function.
  636. @item
  637. Specify the maximum length of the result.
  638. @item
  639. Specify (for @code{REAL} functions) the maximum number of decimals.
  640. @item
  641. Specify whether or not the result can be @code{NULL}.
  642. @end itemize
  643. @item @code{xxx_deinit()} (optional)
  644. The deinitialization function for @code{xxx()}.  It should deallocate any
  645. memory allocated by the initialization function.
  646. @end table
  647. When a SQL statement invokes @code{XXX()}, @strong{MySQL} calls the
  648. initialization function @code{xxx_init()} to let it perform any required
  649. setup, such as argument checking or memory allocation.  If @code{xxx_init()}
  650. returns an error, the SQL statement is aborted with an error message and the
  651. main and deinitialization functions are not called.  Otherwise, the main
  652. function @code{xxx()} is called once for each row.  After all rows have been
  653. processed, the deinitialization function @code{xxx_deinit()} is called so it
  654. can perform any required cleanup.
  655. All functions must be thread safe (not just the main function,
  656. but the initialization and deinitialization functions as well). This means
  657. that you are not allowed to allocate any global or static variables that
  658. change!  If you need memory, you should allocate it in @code{xxx_init()}
  659. and free it in @code{xxx_deinit()}.
  660. @cindex calling sequences, UDF
  661. @node UDF calling sequences, UDF arguments, Adding UDF, Adding UDF
  662. @subsection UDF Calling Sequences
  663. The main function should be declared as shown below.  Note that the return
  664. type and parameters differ, depending on whether you will declare the SQL
  665. function @code{XXX()} to return @code{STRING}, @code{INTEGER}, or @code{REAL}
  666. in the @code{CREATE FUNCTION} statement:
  667. @noindent
  668. For @code{STRING} functions:
  669. @example
  670. char *xxx(UDF_INIT *initid, UDF_ARGS *args,
  671.               char *result, unsigned long *length,
  672.               char *is_null, char *error);
  673. @end example
  674. @noindent
  675. For @code{INTEGER} functions:
  676. @example
  677. long long xxx(UDF_INIT *initid, UDF_ARGS *args,
  678.               char *is_null, char *error);
  679. @end example
  680. @noindent
  681. For @code{REAL} functions:
  682. @example
  683. double xxx(UDF_INIT *initid, UDF_ARGS *args,
  684.               char *is_null, char *error);
  685. @end example
  686. The initialization and deinitialization functions are declared like this:
  687. @example
  688. my_bool xxx_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
  689. void xxx_deinit(UDF_INIT *initid);
  690. @end example
  691. The @code{initid} parameter is passed to all three functions.  It points to a
  692. @code{UDF_INIT} structure that is used to communicate information between
  693. functions.  The @code{UDF_INIT} structure members are listed below.  The
  694. initialization function should fill in any members that it wishes to change.
  695. (To use the default for a member, leave it unchanged.):
  696. @table @code
  697. @item my_bool maybe_null
  698. @code{xxx_init()} should set @code{maybe_null} to @code{1} if @code{xxx()}
  699. can return @code{NULL}.  The default value is @code{1} if any of the
  700. arguments are declared @code{maybe_null}.
  701. @item unsigned int decimals
  702. Number of decimals.  The default value is the maximum number of decimals in
  703. the arguments passed to the main function.  (For example, if the function is
  704. passed @code{1.34}, @code{1.345}, and @code{1.3}, the default would be 3,
  705. because @code{1.345} has 3 decimals.
  706. @item unsigned int max_length
  707. The maximum length of the string result.  The default value differs depending
  708. on the result type of the function.  For string functions, the default is the
  709. length of the longest argument.  For integer functions, the default is 21
  710. digits.  For real functions, the default is 13 plus the number of decimals
  711. indicated by @code{initid->decimals}.  (For numeric functions, the length
  712. includes any sign or decimal point characters.)
  713. @item char *ptr
  714. A pointer that the function can use for its own purposes.  For example,
  715. functions can use @code{initid->ptr} to communicate allocated memory
  716. between functions.  In @code{xxx_init()}, allocate the memory and assign it
  717. to this pointer:
  718. @example
  719. initid->ptr = allocated_memory;
  720. @end example
  721. In @code{xxx()} and @code{xxx_deinit()}, refer to @code{initid->ptr} to use
  722. or deallocate the memory.
  723. @end table
  724. @cindex argument processing
  725. @cindex processing, arguments
  726. @node UDF arguments, UDF return values, UDF calling sequences, Adding UDF
  727. @subsection Argument Processing
  728. The @code{args} parameter points to a @code{UDF_ARGS} structure that thas the
  729. members listed below:
  730. @table @code
  731. @item unsigned int arg_count
  732. The number of arguments.  Check this value in the initialization function
  733. if you want your function to be called with a particular number of arguments.
  734. For example:
  735. @example
  736. if (args->arg_count != 2)
  737. @{
  738.     strcpy(message,"XXX() requires two arguments");
  739.     return 1;
  740. @}
  741. @end example
  742. @item enum Item_result *arg_type
  743. The types for each argument.  The possible type values are
  744. @code{STRING_RESULT}, @code{INT_RESULT}, and @code{REAL_RESULT}.
  745. To make sure that arguments are of a given type and return an
  746. error if they are not, check the @code{arg_type} array in the initialization
  747. function.  For example:
  748. @example
  749. if (args->arg_type[0] != STRING_RESULT ||
  750.     args->arg_type[1] != INT_RESULT)
  751. @{
  752.     strcpy(message,"XXX() requires a string and an integer");
  753.     return 1;
  754. @}
  755. @end example
  756. As an alternative to requiring your function's arguments to be of particular
  757. types, you can use the initialization function to set the @code{arg_type}
  758. elements to the types you want.  This causes @strong{MySQL} to coerce
  759. arguments to those types for each call to @code{xxx()}.  For example, to
  760. specify coercion of the first two arguments to string and integer, do this in
  761. @code{xxx_init()}:
  762. @example
  763. args->arg_type[0] = STRING_RESULT;
  764. args->arg_type[1] = INT_RESULT;
  765. @end example
  766. @item char **args
  767. @code{args->args} communicates information to the initialization function
  768. about the general nature of the arguments your function was called with.  For a
  769. constant argument @code{i}, @code{args->args[i]} points to the argument
  770. value.  (See below for instructions on how to access the value properly.)
  771. For a non-constant argument, @code{args->args[i]} is @code{0}.
  772. A constant argument is an expression that uses only constants, such as
  773. @code{3} or @code{4*7-2} or @code{SIN(3.14)}.  A non-constant argument is an
  774. expression that refers to values that may change from row to row, such as
  775. column names or functions that are called with non-constant arguments.
  776. For each invocation of the main function, @code{args->args} contains the
  777. actual arguments that are passed for the row currently being processed.
  778. Functions can refer to an argument @code{i} as follows:
  779. @itemize @bullet
  780. @item
  781. An argument of type @code{STRING_RESULT} is given as a string pointer plus a
  782. length, to allow handling of binary data or data of arbitrary length.  The
  783. string contents are available as @code{args->args[i]} and the string length
  784. is @code{args->lengths[i]}.  You should not assume that strings are
  785. null-terminated.
  786. @item
  787. For an argument of type @code{INT_RESULT}, you must cast
  788. @code{args->args[i]} to a @code{long long} value:
  789. @example
  790. long long int_val;
  791. int_val = *((long long*) args->args[i]);
  792. @end example
  793. @item
  794. For an argument of type @code{REAL_RESULT}, you must cast
  795. @code{args->args[i]} to a @code{double} value:
  796. @example
  797. double    real_val;
  798. real_val = *((double*) args->args[i]);
  799. @end example
  800. @end itemize
  801. @item unsigned long *lengths
  802. For the initialization function, the @code{lengths} array indicates the
  803. maximum string length for each argument.  For each invocation of the main
  804. function, @code{lengths} contains the actual lengths of any string arguments
  805. that are passed for the row currently being processed.  For arguments of
  806. types @code{INT_RESULT} or @code{REAL_RESULT}, @code{lengths} still contains
  807. the maximum length of the argument (as for the initialization function).
  808. @end table
  809. @cindex UDFs, return values
  810. @cindex return values, UDFs
  811. @cindex errors, handling for UDFs
  812. @cindex handling, errors
  813. @node UDF return values, UDF compiling, UDF arguments, Adding UDF
  814. @subsection Return Values and Error Handling
  815. The initialization function should return @code{0} if no error occurred and
  816. @code{1} otherwise.  If an error occurs, @code{xxx_init()} should store a
  817. null-terminated error message in the @code{message} parameter.  The message
  818. will be returned to the client.  The message buffer is
  819. @code{MYSQL_ERRMSG_SIZE} characters long, but you should try to keep the
  820. message to less than 80 characters so that it fits the width of a standard
  821. terminal screen.
  822. The return value of the main function @code{xxx()} is the function value, for
  823. @code{long long} and @code{double} functions.  A string functions should
  824. return a pointer to the result and store the length of the string in the
  825. @code{length} arguments. @code{result} is a buffer at least 255 bytes long.
  826. Set these to the contents and length of the return value.  For example:
  827. @example
  828. memcpy(result, "result string", 13);
  829. *length = 13;
  830. @end example
  831. If your string functions that needs to return a string longer than 255
  832. bytes, you must allocate the space for it with @code{malloc()} in your
  833. @code{xxx_init()} function or your @code{xxx()} function and free it in
  834. your @code{xxx_deinit()} function.  You can store the allocated memory
  835. in the @code{ptr} slot in the @code{UDF_INIT} structure for reuse by
  836. future @code{xxx()} calls.  @xref{UDF calling sequences}.
  837. To indicate a return value of @code{NULL} in the main function, set
  838. @code{is_null} to @code{1}:
  839. @example
  840. *is_null = 1;
  841. @end example
  842. To indicate an error return in the main function, set the @code{error}
  843. parameter to @code{1}:
  844. @example
  845. *error = 1;
  846. @end example
  847. If @code{xxx()} sets @code{*error} to @code{1} for any row, the function
  848. value is @code{NULL} for the current row and for any subsequent rows
  849. processed by the statement in which @code{XXX()} was invoked.  (@code{xxx()}
  850. will not even be called for subsequent rows.) @strong{NOTE:} In
  851. @strong{MySQL} versions prior to 3.22.10, you should set both @code{*error}
  852. and @code{*is_null}:
  853. @example
  854. *error = 1;
  855. *is_null = 1;
  856. @end example
  857. @cindex compiling, user-defined functions
  858. @cindex UDFs, compiling
  859. @cindex installing, user-defined functions
  860. @node UDF compiling,  , UDF return values, Adding UDF
  861. @subsection Compiling and Installing User-definable Functions
  862. Files implementing UDFs must be compiled and installed on the host where the
  863. server runs.  This process is described below for the example UDF file
  864. @file{udf_example.cc} that is included in the @strong{MySQL} source
  865. distribution.  This file contains the following functions:
  866. @itemize @bullet
  867. @item
  868. @code{metaphon()} returns a metaphon string of the string argument.
  869. This is something like a soundex string, but it's more tuned for English.
  870. @item
  871. @code{myfunc_double()} returns the sum of the ASCII values of the
  872. characters in its arguments, divided by the sum of the length of its arguments.
  873. @item
  874. @code{myfunc_int()} returns the sum of the length of its arguments.
  875. @item
  876. @code{sequence([const int])} returns an sequence starting from the given
  877. number or 1 if no number has been given.
  878. @item
  879. @code{lookup()} returns the IP number for a hostname.
  880. @item
  881. @code{reverse_lookup()} returns the hostname for an IP number.
  882. The function may be called with a string @code{"xxx.xxx.xxx.xxx"} or
  883. four numbers.
  884. @end itemize
  885. A dynamically loadable file should be compiled as a sharable object file,
  886. using a command something like this:
  887. @example
  888. shell> gcc -shared -o udf_example.so myfunc.cc
  889. @end example
  890. You can easily find out the correct compiler options for your system by
  891. running this command in the @file{sql} directory of your @strong{MySQL}
  892. source tree:
  893. @example
  894. shell> make udf_example.o
  895. @end example
  896. You should run a compile command similar to the one that @code{make} displays,
  897. except that you should remove the @code{-c} option near the end of the line
  898. and add @code{-o udf_example.so} to the end of the line.  (On some systems,
  899. you may need to leave  the @code{-c} on the command.)
  900. Once you compile a shared object containing UDFs, you must install it
  901. and tell @strong{MySQL} about it.  Compiling a shared object from
  902. @file{udf_example.cc} produces a file named something like
  903. @file{udf_example.so} (the exact name may vary from platform to platform).
  904. Copy this file to some directory searched by @code{ld}, such as
  905. @file{/usr/lib}.  On many systems, you can set the @code{LD_LIBRARY} or
  906. @code{LD_LIBRARY_PATH} environment variable to point at the directory where
  907. you have your UDF function files. The @code{dlopen} manual page tells you
  908. which variable you should use on your system. You should set this in
  909. @code{mysql.server} or @code{safe_mysqld} and restart @code{mysqld}.
  910. After the library is installed, notify @code{mysqld} about the new
  911. functions with these commands:
  912. @example
  913. mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
  914. mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
  915. mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
  916. mysql> CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
  917. mysql> CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";
  918. @end example
  919. Functions can be deleted using @code{DROP FUNCTION}:
  920. @example
  921. mysql> DROP FUNCTION metaphon;
  922. mysql> DROP FUNCTION myfunc_double;
  923. mysql> DROP FUNCTION myfunc_int;
  924. mysql> DROP FUNCTION lookup;
  925. mysql> DROP FUNCTION reverse_lookup;
  926. @end example
  927. The @code{CREATE FUNCTION} and @code{DROP FUNCTION} statements update the
  928. system table @code{func} in the @code{mysql} database.  The function's name,
  929. type and shared library name are saved in the table.  You must have the
  930. @strong{insert} and @strong{delete} privileges for the @code{mysql} database
  931. to create and drop functions.
  932. You should not use @code{CREATE FUNCTION} to add a function that has already
  933. been created.  If you need to reinstall a function, you should remove it with
  934. @code{DROP FUNCTION} and then reinstall it with @code{CREATE FUNCTION}.  You
  935. would need to do this, for example, if you recompile a new version of your
  936. function, so that @code{mysqld} gets the new version.  Otherwise the server
  937. will continue to use the old version.
  938. Active functions are reloaded each time the server starts, unless you start
  939. @code{mysqld} with the @code{--skip-grant-tables} option.  In this case, UDF
  940. initialization is skipped and UDFs are unavailable.  (An active function is
  941. one that has been loaded with @code{CREATE FUNCTION} and not removed with
  942. @code{DROP FUNCTION}.)
  943. @cindex adding, native functions
  944. @cindex native functions, adding
  945. @cindex functions, native, adding
  946. @node Adding native function,  , Adding UDF, Adding functions
  947. @section Adding a New Native Function
  948. The procedure for adding a new native function is described below.  Note that
  949. you cannot add native functions to a binary distribution because the procedure
  950. involves modifying @strong{MySQL} source code.  You must compile
  951. @strong{MySQL} yourself from a source distribution.  Also note that if you
  952. migrate to another version of @strong{MySQL} (for example, when a new version is
  953. released), you will need to repeat the procedure with the new version.
  954. To add a new native @strong{MySQL} function, follow these steps:
  955. @enumerate
  956. @item
  957. Add one line to @file{lex.h} that defines the function name in the
  958. @code{sql_functions[]} array.
  959. @item
  960. Add two lines to @file{sql_yacc.yy}. One indicates the preprocessor
  961. symbol that @code{yacc} should define (this should be added at the
  962. beginning of the file). Then define the function parameters and add an
  963. ``item'' with these parameters to the @code{simple_expr} parsing rule.
  964. For an example, check all occurrences of @code{SOUNDEX} in
  965. @file{sql_yacc.yy} to see how this is done.
  966. @item
  967. In @file{item_func.h}, declare a class inheriting from @code{Item_num_func} or
  968. @code{Item_str_func}, depending on whether your function returns a number or a
  969. string.
  970. @item
  971. In @file{item_func.cc}, add one of the following declarations, depending
  972. on whether you are defining a numeric or string function:
  973. @example
  974. double   Item_func_newname::val()
  975. longlong Item_func_newname::val_int()
  976. String  *Item_func_newname::Str(String *str)
  977. @end example
  978. @item
  979. You should probably also define the following function:
  980. @example
  981. void Item_func_newname::fix_length_and_dec()
  982. @end example
  983. This function should at least calculate @code{max_length} based on the
  984. given arguments. @code{max_length} is the maximum number of characters
  985. the function may return.  This function should also set @code{maybe_null = 0}
  986. if the main function can't return a @code{NULL} value.  The function can check
  987. if any of the function arguments can return @code{NULL} by checking the
  988. arguments @code{maybe_null} variable.
  989. @end enumerate
  990. All functions must be thread safe.
  991. For string functions, there are some additional considerations to be aware of:
  992. @itemize @bullet
  993. @item
  994. The @code{String *str} argument provides a string
  995. buffer that may be used to hold the result.
  996. @item
  997. The function should return the string that holds the result.
  998. @item
  999. All current string functions try to avoid allocating any memory unless
  1000. absolutely necessary!
  1001. @end itemize
  1002. @cindex procedures, adding
  1003. @cindex adding, procedures
  1004. @cindex new procedures, adding
  1005. @node Adding procedures, ODBC, Adding functions, Top
  1006. @chapter Adding New Procedures to MySQL
  1007. In @strong{MySQL}, you can define a procedure in C++ that can access and
  1008. modify the data in a query before it is sent to the client.  The modification
  1009. can be done on row-by-row or @code{GROUP BY} level.
  1010. We have created an example procedure in @strong{MySQL} Version 3.23 to
  1011. show you what can be done.
  1012. Additionally we recommend you to take a look at 'mylua', which you can find in the Contrib directory. @xref{Contrib}.  Which this you can use the LUA
  1013. language to load a procedure at runtime into @code{mysqld}.
  1014. @menu
  1015. * procedure analyse::           Procedure analyse
  1016. * Writing a procedure::         Writing a procedure.
  1017. @end menu
  1018. @node procedure analyse, Writing a procedure, Adding procedures, Adding procedures
  1019. @section Procedure Analyse
  1020. @code{analyse([max elements,[max memory]])}
  1021. This procedure is defined in the @file{sql/sql_analyse.cc}.  This
  1022. examines the result from your query and returns an analysis of the
  1023. results:
  1024. @itemize @bullet
  1025. @item
  1026. @code{max elements} (default 256) is the maximum number of distinct values
  1027. @code{analyse} will notice per column.  This is used by @code{analyse} to check if
  1028. the optimal column type should be of type @code{ENUM}.
  1029. @item
  1030. @code{max memory} (default 8192) is the maximum memory @code{analyse} should
  1031. allocate per column while trying to find all distinct values.
  1032. @end itemize
  1033. @example
  1034. SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])
  1035. @end example
  1036. @node Writing a procedure,  , procedure analyse, Adding procedures
  1037. @section Writing a Procedure
  1038. For the moment, the only documentation for this is the source.
  1039. You can find all information about procedures by examining the following files:
  1040. @itemize @bullet
  1041. @item @file{sql/sql_analyse.cc}
  1042. @item @file{sql/procedure.h}
  1043. @item @file{sql/procedure.cc}
  1044. @item @file{sql/sql_select.cc}
  1045. @end itemize
  1046. @cindex ODBC
  1047. @cindex Windows
  1048. @cindex MyODBC
  1049. @node ODBC, Common programs, Adding procedures, Top
  1050. @chapter MySQL ODBC Support
  1051. @menu
  1052. * Installing MyODBC::           How to install MyODBC
  1053. * ODBC administrator::          How to fill in the various fields in the ODBC administrator program
  1054. * ODBC Problems::               How to report problems with @strong{MySQL} ODBC
  1055. * MyODBC clients::              Programs known to work with @strong{MyODBC}
  1056. * ODBC and last_insert_id::     How to get the value of an @code{AUTO_INCREMENT} column in ODBC
  1057. * MyODBC bug report::           Reporting problems with MyODBC
  1058. @end menu
  1059. @strong{MySQL} provides support for ODBC by means of the @strong{MyODBC}
  1060. program.
  1061. @node Installing MyODBC, ODBC administrator, ODBC, ODBC
  1062. @section How To Install MyODBC
  1063. @strong{MyODBC} is a 32-bit ODBC (2.50) level 0 (with level 1 and level
  1064. 2 features) driver for connecting an ODBC-aware application to
  1065. @strong{MySQL}.  @strong{MyODBC} works on Windows95, Windows98, NT, and
  1066. on most Unix platforms.
  1067. @strong{MyODBC} is in public domain, and you can find the newest version
  1068. at @uref{http://www.mysql.com/downloads/api-myodbc.html}.
  1069. If you have problem with @strong{MyODBC} and your program also works
  1070. with OLEDB, you should try the OLEDB driver that you can find in the
  1071. Contrib section.  @xref{Contrib}.
  1072. Normally you only need to install @strong{MyODBC} on Windows machines.
  1073. You only need @strong{MyODBC} for Unix if you have a program like
  1074. ColdFusion that is running on the Unix machine and uses ODBC to connect
  1075. to the databases.
  1076. If you want to install @strong{MyODBC} on a Unix box, you will also need
  1077. an @strong{ODBC} manager.  @strong{MyODBC} is known to work with
  1078. most of the Unix ODBC managers.  You can find a list at these in the
  1079. @strong{ODBC}-related links section on the @strong{MySQL} useful links page.
  1080. @xref{Useful Links}.
  1081. To install @strong{MyODBC} on windows, you should download the
  1082. appropriate @strong{MyODBC} .zip file (for Windows or NT/Win2000),
  1083. unpack it with @code{WINZIP}, or some similar program, and execute the
  1084. @code{SETUP.EXE} file.
  1085. On Windows/NT you may get the following error when trying to install
  1086. @strong{MyODBC}:
  1087. @example
  1088. An error occurred while copying C:WINDOWSSYSTEMMFC30.DLL. Restart
  1089. Windows and try installing again (before running any applications which
  1090. use ODBC)
  1091. @end example
  1092. The problem in this case is that some other program is using ODBC and
  1093. because of how Windows is designed, you may not in this case be able to
  1094. install a new ODBC drivers with Microsoft's ODBC setup program. In most
  1095. cases you can continue by just pressing @code{Ignore} to copy the rest
  1096. of the MyODBC files and the final installation should still work.  If
  1097. this doesn't work, the the solution is to reboot your computer in ``safe
  1098. mode`` (Choose this by pressing F8 just before your machine starts
  1099. Windows during rebooting), install @strong{MyODBC}, and reboot to normal
  1100. mode.
  1101. @itemize @bullet
  1102. @item
  1103. To make a connection to a Unix box from a Windows box, with an ODBC
  1104. application (one that doesn't support @strong{MySQL} natively), you must
  1105. first install @strong{MyODBC} on the Windows machine.
  1106. @item
  1107. The user and Windows machine must have the access privileges to the
  1108. @strong{MySQL} server on the Unix machine.  This is set up with the
  1109. @code{GRANT} command. @xref{GRANT,,@code{GRANT}}.
  1110. @item
  1111. You must create an ODBC DSN entry as follows:
  1112. @itemize @minus
  1113. @item
  1114. Open the Control Panel on the Windows machine.
  1115. @item
  1116. Double-click the ODBC Data Sources 32 bits icon.
  1117. @item
  1118. Click the tab User DSN.
  1119. @item
  1120. Click the button Add.
  1121. @item
  1122. Select @strong{MySQL} in the screen Create New Data Source and click
  1123. the Finish button.
  1124. @item
  1125. The @strong{MySQL} Driver default configuration screen is shown.
  1126. @xref{ODBC administrator}.
  1127. @end itemize
  1128. @item
  1129. Now start your application and select the ODBC driver with the DSN you
  1130. specified in the ODBC administrator.
  1131. @end itemize
  1132. Notice that there are other configuration options on the screen of
  1133. @strong{MySQL} (trace, don't prompt on connect, etc) that you can try if
  1134. you run into problems.
  1135. @cindex ODBC, administrator
  1136. @node ODBC administrator, ODBC Problems, Installing MyODBC, ODBC
  1137. @section How to Fill in the Various Fields in the ODBC Administrator Program
  1138. There are three possibilities for specifying the server name on
  1139. Windows95:
  1140. @itemize @bullet
  1141. @item
  1142. Use the IP address of the server.
  1143. @item
  1144. Add a file @file{windowslmhosts} with the following information:
  1145. @example
  1146. ip hostname
  1147. @end example
  1148. For example:
  1149. @example
  1150. 194.216.84.21 my_hostname
  1151. @end example
  1152. @item
  1153. Configure the PC to use DNS.
  1154. @end itemize
  1155. Example of how to fill in the @code{ODBC setup}:
  1156. @example
  1157. Windows DSN name:   test
  1158. Description:        This is my test database
  1159. MySql Database:     test
  1160. Server:             194.216.84.21
  1161. User:               monty
  1162. Password:           my_password
  1163. Port:
  1164. @end example
  1165. The value for the @code{Windows DSN name} field is any name that is unique
  1166. in your Windows ODBC setup.
  1167. You don't have to specify values for the @code{Server}, @code{User},
  1168. @code{Password}, or @code{Port} fields in the ODBC setup screen.
  1169. However, if you do, the values will be used as the defaults later when
  1170. you attempt to make a connection.  You have the option of changing the
  1171. values at that time.
  1172. If the port number is not given, the default port (@value{default_port})
  1173. is used.
  1174. If you specify the option @code{Read options from C:my.cnf}, the groups
  1175. @code{client} and @code{odbc} will be read from the @file{C:my.cnf} file.
  1176. You can use all options that are usable by @code{mysql_options()}.
  1177. @xref{mysql_options, , @code{mysql_options}}.
  1178. @node ODBC Problems, MyODBC clients, ODBC administrator, ODBC
  1179. @section How to Report Problems with MyODBC
  1180. @strong{MyODBC} has been tested with Access, Admndemo.exe, C++-Builder,
  1181. Borland Builder 4, Centura Team Developer (formerly Gupta SQL/Windows),
  1182. ColdFusion (on Solaris and NT with svc pack 5), Crystal Reports,
  1183. DataJunction, Delphi, ERwin, Excel, iHTML, FileMaker Pro, FoxPro, Notes
  1184. 4.5/4.6, SBSS, Perl DBD-ODBC, Paradox, Powerbuilder, Powerdesigner 32
  1185. bit, VC++, and Visual Basic.
  1186. If you know of any other applications that work with @strong{MyODBC}, please
  1187. send mail to @email{myodbc@@lists.mysql.com} about this!
  1188. With some programs you may get an error like:
  1189. @code{Another user has modifies the record that you have modified}. In most
  1190. cases this can be solved by doing one of the following things:
  1191. @itemize @bullet
  1192. @item
  1193. Add a primary key for the table if there isn't one already.
  1194. @item
  1195. Add a timestamp column if there isn't one already.
  1196. @item
  1197. Only use double float fields. Some programs may fail when they compare
  1198. single floats.
  1199. @end itemize
  1200. If the above doesn't help, you should do a @code{MyODBC} trace file and
  1201. try to figure out why things go wrong.
  1202. @node MyODBC clients, ODBC and last_insert_id, ODBC Problems, ODBC
  1203. @section Programs Known to Work with MyODBC
  1204. Most programs should work with @strong{MyODBC}, but for each of those
  1205. listed below, we have tested it ourselves or received confirmation from
  1206. some user that it works:
  1207. @table @asis
  1208. @item @strong{Program}
  1209. @strong{Comment}
  1210. @cindex Access program
  1211. @item Access
  1212. To make Access work:
  1213. @itemize @bullet
  1214. @item
  1215. If you are using Access 2000, you should get and install the newest
  1216. Microsoft MDAC (@code{Microsoft Data Access Components}) from
  1217. @uref{http://www.microsoft.com/data}.  This will fix the following bug
  1218. in Access: when you export data to @strong{MySQL}, the table and column
  1219. names aren't specified.  Another way to around this bug is to upgrade to
  1220. MyODBC Version 2.50.33 and @strong{MySQL} Version 3.23.x, which together
  1221. provide a workaround for this bug!
  1222. Note that if you are using @strong{MySQL} Version 3.22, you must to apply the
  1223. MDAC patch and use MyODBC 2.50.32 or 2.50.34 and above to go around
  1224. this problem.
  1225. @item
  1226. Set the ``Return matching rows'' MyODBC option field when connecting to
  1227. @strong{MySQL}.
  1228. @item
  1229. You should have a primary key in the table. If not, new or updated rows
  1230. may show up as @code{#Deleted#}.
  1231. @item
  1232. You should have a timestamp in all tables you want to be able to update.
  1233. For maximum portability @code{TIMESTAMP(14)} or simple @code{TIMESTAMP}
  1234. is recommended instead of other @code{TIMESTAMP(X)} variations.
  1235. @item
  1236. Only use double float fields. Access fails when comparing with single floats.
  1237. The symptom usually is that new or updated rows may show up as @code{#Deleted#}
  1238. or that you can't find or update rows.
  1239. @item
  1240. If you still get the error @code{Another user has changed your data} after
  1241. adding a @code{TIMESTAMP} column, the following trick may help you:
  1242. Don't use @code{table} data sheet view. Create instead a form with the
  1243. fields you want, and use that @code{form} data sheet view.  You should
  1244. set the @code{DefaultValue} property for the @code{TIMESTAMP} column to
  1245. @code{NOW()}.  It may be a good idea to hide the @code{TIMESTAMP} column
  1246. from view so your users are not confused.
  1247. @item
  1248. Access on NT will report @code{BLOB} columns as @code{OLE OBJECTS}. If
  1249. you want to have @code{MEMO} columns instead, you should change the
  1250. column to @code{TEXT} with @code{ALTER TABLE}.
  1251. @item
  1252. Access can't always handle @code{DATE} columns properly. If you have a problem
  1253. with these, change the columns to @code{DATETIME}.
  1254. @item
  1255. In some cases, Access may generate illegal SQL queries that
  1256. @strong{MySQL} can't understand. You can fix this by selecting
  1257. @code{"Query|SQLSpecific|Pass-Through"} from the Access menu.
  1258. @item
  1259. If you have in Access a column defined as BYTE, Access will try to export this
  1260. as @code{TINYINT} instead of @code{TINYINT UNSIGNED}.  This will give you
  1261. problems if you have values > 127 in the column!
  1262. @end itemize
  1263. @cindex ADO program
  1264. @item ADO
  1265. When you are coding with the ADO API and @strong{MyODBC} you need to put
  1266. attention in some default properties that aren't supported by the
  1267. @strong{MySQL} server.  For example, using the @code{CursorLocation
  1268. Property} as @code{adUseServer} will return for the @code{RecordCount
  1269. Property} a result of -1. To have the right value, you need to set this
  1270. property to @code{adUseClient}, like is showing in the VB code below:
  1271. @example
  1272. Dim myconn As New ADODB.Connection
  1273. Dim myrs As New Recordset
  1274. Dim mySQL As String
  1275. Dim myrows As Long
  1276. myconn.Open "DSN=MyODBCsample"
  1277. mySQL = "SELECT * from user"
  1278. myrs.Source = mySQL
  1279. Set myrs.ActiveConnection = myconn
  1280. myrs.CursorLocation = adUseClient
  1281. myrs.Open
  1282. myrows = myrs.RecordCount
  1283. myrs.Close
  1284. myconn.Close
  1285. @end example
  1286. Another workaround is to use a @code{SELECT COUNT(*)} statement
  1287. for a similar query to get the correct row count.
  1288. @cindex Borland Buidler 4 program
  1289. @item Borland Builder 4
  1290. When you start a query you can use the property @code{Active} or use the
  1291. method @code{Open}.  Note that @code{Active} will start by automatically
  1292. issuing a @code{SELECT * FROM ...} query that may not be a good thing if
  1293. your tables are big!
  1294. @item ColdFusion (On Unix)
  1295. The following information is taken from the ColdFusion documentation:
  1296. Use the following information to configure ColdFusion Server for Linux
  1297. to use the unixODBC driver with @strong{MyODBC} for @strong{MySQL} data
  1298. sources.  Allaire has verified that @strong{MyODBC} Version 2.50.26
  1299. works with @strong{MySQL} Version 3.22.27 and ColdFusion for Linux. (Any
  1300. newer version should also work.) You can download @strong{MyODBC} at
  1301. @uref{http://www.mysql.com/downloads/api-myodbc.html}
  1302. @cindex ColdFusion program
  1303. ColdFusion Version 4.5.1 allows you to us the ColdFusion Administrator
  1304. to add the @strong{MySQL} data source. However, the driver is not
  1305. included with ColdFusion Version 4.5.1. Before the @strong{MySQL} driver
  1306. will appear in the ODBC datasources drop-down list, you must build and
  1307. copy the @strong{MyODBC} driver to
  1308. @file{/opt/coldfusion/lib/libmyodbc.so}.
  1309. The Contrib directory contains the program mydsn-xxx.zip which allows
  1310. you to build and remove the DSN registry file for the MyODBC driver
  1311. on Coldfusion applications.
  1312. @cindex DataJunction
  1313. @item DataJunction
  1314. You have to change it to output @code{VARCHAR} rather than @code{ENUM}, as
  1315. it exports the latter in a manner that causes @strong{MySQL} grief.
  1316. @cindex Excel
  1317. @item Excel
  1318. Works. Some tips:
  1319. @itemize @bullet
  1320. @item
  1321. If you have problems with dates, try to select them as strings using the
  1322. @code{CONCAT()} function. For example:
  1323. @example
  1324. select CONCAT(rise_time), CONCAT(set_time)
  1325.     from sunrise_sunset;
  1326. @end example
  1327. Values retrieved as strings this way should be correctly recognized
  1328. as time values by Excel97.
  1329. The purpose of @code{CONCAT()} in this example is to fool ODBC into thinking
  1330. the column is of ``string type''. Without the @code{CONCAT()}, ODBC knows the
  1331. column is of time type, and Excel does not understand that.
  1332. Note that this is a bug in Excel, because it automatically converts a
  1333. string to a time. This would be great if the source was a text file, but
  1334. is plain stupid when the source is an ODBC connection that reports
  1335. exact types for each column.
  1336. @end itemize
  1337. @cindex Word program
  1338. @item Word
  1339. To retrieve data from @strong{MySQL} to Word/Excel documents, you need to
  1340. use the @code{MyODBC} driver and the Add-in Microsoft Query help.
  1341. For example, create a db with a table containing 2 columns of text:
  1342. @itemize @bullet
  1343. @item
  1344. Insert rows using the mysql client command-line tool.
  1345. @item
  1346. Create a DSN file using the MyODBC driver, for example, my for the db above.
  1347. @item
  1348. Open the Word application.
  1349. @item
  1350. Create a blank new documentation.
  1351. @item
  1352. Using the tool bar called Database, press the button insert database.
  1353. @item
  1354. Press the button Get Data.
  1355. @item
  1356. At the right hand of the screen Get Data, press the button Ms Query.
  1357. @item
  1358. In the Ms Query create a New Data Source using the DSN file my.
  1359. @item
  1360. Select the new query.
  1361. @item
  1362. Select the columns that you want.
  1363. @item
  1364. Make a filter if you want.
  1365. @item
  1366. Make a Sort if you want.
  1367. @item
  1368. Select Return Data to Microsoft Word.
  1369. @item
  1370. Click Finish.
  1371. @item
  1372. Click Insert data and select the records.
  1373. @item
  1374. Click OK and you see the rows in your Word document.
  1375. @end itemize
  1376. @cindex odbcadmin program
  1377. @item odbcadmin
  1378. Test program for ODBC.
  1379. @cindex Delphi program
  1380. @item Delphi
  1381. You must use DBE Version 3.2 or newer.  Set the `Don't optimize column width'
  1382. option field when connecting to @strong{MySQL}.
  1383. Also, here is some potentially useful Delphi code that sets up both an
  1384. ODBC entry and a BDE entry for @strong{MyODBC} (the BDE entry requires a BDE
  1385. Alias Editor that is free at a Delphi Super Page near
  1386. you. (Thanks to Bryan Brunton @email{bryan@@flesherfab.com} for this):
  1387. @example
  1388. fReg:= TRegistry.Create;
  1389.   fReg.OpenKey('SoftwareODBCODBC.INIDocumentsFab', True);
  1390.   fReg.WriteString('Database', 'Documents');
  1391.   fReg.WriteString('Description', ' ');
  1392.   fReg.WriteString('Driver', 'C:WINNTSystem32myodbc.dll');
  1393.   fReg.WriteString('Flag', '1');
  1394.   fReg.WriteString('Password', '');
  1395.   fReg.WriteString('Port', ' ');
  1396.   fReg.WriteString('Server', 'xmark');
  1397.   fReg.WriteString('User', 'winuser');
  1398.   fReg.OpenKey('SoftwareODBCODBC.INIODBC Data Sources', True);
  1399.   fReg.WriteString('DocumentsFab', 'MySQL');
  1400.   fReg.CloseKey;
  1401.   fReg.Free;
  1402.   Memo1.Lines.Add('DATABASE NAME=');
  1403.   Memo1.Lines.Add('USER NAME=');
  1404.   Memo1.Lines.Add('ODBC DSN=DocumentsFab');
  1405.   Memo1.Lines.Add('OPEN MODE=READ/WRITE');
  1406.   Memo1.Lines.Add('BATCH COUNT=200');
  1407.   Memo1.Lines.Add('LANGDRIVER=');
  1408.   Memo1.Lines.Add('MAX ROWS=-1');
  1409.   Memo1.Lines.Add('SCHEMA CACHE DIR=');
  1410.   Memo1.Lines.Add('SCHEMA CACHE SIZE=8');
  1411.   Memo1.Lines.Add('SCHEMA CACHE TIME=-1');
  1412.   Memo1.Lines.Add('SQLPASSTHRU MODE=SHARED AUTOCOMMIT');
  1413.   Memo1.Lines.Add('SQLQRYMODE=');
  1414.   Memo1.Lines.Add('ENABLE SCHEMA CACHE=FALSE');
  1415.   Memo1.Lines.Add('ENABLE BCD=FALSE');
  1416.   Memo1.Lines.Add('ROWSET SIZE=20');
  1417.   Memo1.Lines.Add('BLOBS TO CACHE=64');
  1418.   Memo1.Lines.Add('BLOB SIZE=32');
  1419.   AliasEditor.Add('DocumentsFab','MySQL',Memo1.Lines);
  1420. @end example
  1421. @cindex C++Builder
  1422. @item C++Builder
  1423. Tested with BDE Version 3.0. The only known problem is that when the table
  1424. schema changes, query fields are not updated. BDE, however, does not seem
  1425. to recognize primary keys, only the index PRIMARY, though this has not
  1426. been a problem.
  1427. @cindex Visual Basic
  1428. @item Visual Basic
  1429. To be able to update a table, you must define a primary key for the table.
  1430. Visual Basic with ADO can't handle big integers. This means that some queries
  1431. like @code{SHOW PROCESSLIST} will not work properly.  The fix is to set
  1432. add the option @code{OPTION=16834} in the ODBC connect string or set
  1433. the @code{Change BIGINT columns to INT} option in the MyODBC connect screen.
  1434. @item VisualInterDev
  1435. If you get the error @code{[Microsoft][ODBC Driver Manager] Driver does
  1436. not support this parameter} the reason may be that you have a
  1437. @code{BIGINT} in your result.  Try setting the @code{Change BIGINT
  1438. columns to INT} option in the MyODBC connect screen.
  1439. @end table
  1440. @cindex AUTO-INCREMENT, ODBC
  1441. @node ODBC and last_insert_id, MyODBC bug report, MyODBC clients, ODBC
  1442. @section How to Get the Value of an @code{AUTO_INCREMENT} Column in ODBC
  1443. A common problem is how to get the value of an automatically generated ID
  1444. from an @code{INSERT}. With ODBC, you can do something like this (assuming
  1445. that @code{auto} is an @code{AUTO_INCREMENT} field):
  1446. @example
  1447. INSERT INTO foo (auto,text) VALUES(NULL,'text');
  1448. SELECT LAST_INSERT_ID();
  1449. @end example
  1450. Or, if you are just going to insert the ID into another table, you can do this:
  1451. @example
  1452. INSERT INTO foo (auto,text) VALUES(NULL,'text');
  1453. INSERT INTO foo2 (id,text) VALUES(LAST_INSERT_ID(),'text');
  1454. @end example
  1455. For the benefit of some ODBC applications (at least Delphi and Access),
  1456. the following query can be used to find a newly inserted row:
  1457. @example
  1458. SELECT * FROM tbl_name WHERE auto IS NULL;
  1459. @end example
  1460. @cindex reporting, MyODBC problems
  1461. @cindex problems, ODBC
  1462. @cindex MyODBC, reporting problems
  1463. @node MyODBC bug report,  , ODBC and last_insert_id, ODBC
  1464. @section Reporting Problems with MyODBC
  1465. If you encounter difficulties with @strong{MyODBC}, you should start by
  1466. making a log file from the ODBC manager (the log you get when requesting
  1467. logs from ODBCADMIN) and a @strong{MyODBC} log.
  1468. To get a @strong{MyODBC} log, you need to do the following:
  1469. @enumerate
  1470. @item
  1471. Ensure that you are using @code{myodbcd.dll} and not @code{myodbc.dll}.
  1472. The easiest way to do this is to get @code{myodbcd.dll} from the MyODBC
  1473. distribution and copy it over the @code{myodbc.dll}, which is probably
  1474. in your @code{C:windowssystem32} or @code{C:winntsystem32} directory.
  1475. Note that you probably want to restore the old myodbc.dll file when you
  1476. have finished testing, as this is a lot faster than @code{myodbcd.dll}.
  1477. @item
  1478. Tag the `Trace MyODBC' option flag in the @strong{MyODBC} connect/configure
  1479. screen.  The log will be written to file @file{C:myodbc.log}.
  1480. If the trace option is not remembered when you are going back to the
  1481. above screen, it means that you are not using the @code{myodbcd.dll}
  1482. driver (see above).
  1483. @item
  1484. Start your application and try to get it to fail.
  1485. @end enumerate
  1486. Check the @code{MyODBC trace file}, to find out what could be wrong.
  1487. You should be able to find out the the issued queries by searching after
  1488. the string @code{>mysql_real_query} in the @file{myodbc.log} file.
  1489. You should also try duplicating the queries in the @code{mysql} monitor
  1490. or @code{admndemo} to find out if the error is MyODBC or @strong{MySQL}.
  1491. If you find out something is wrong, please only send the relevant rows
  1492. (max 40 rows) to @email{myodbc@@lists.mysql.com}.  Please never
  1493. send the whole MyODBC or ODBC log file!
  1494. If you are unable to find out what's wrong, the last option is to
  1495. make an archive (tar or zip) that contains a MyODBC trace file, the ODBC
  1496. log file, and a README file that explains the problem.  You can send this
  1497. to @uref{ftp://support.mysql.com/pub/mysql/secret}.  Only we at MySQL AB
  1498. will have access to the files you upload, and we will be very discrete
  1499. with the data!
  1500. If you can create a program that also shows this problem, please
  1501. upload this too!
  1502. If the program works with some other SQL server, you should make an ODBC log
  1503. file where you do exactly the same thing in the other SQL server.
  1504. Remember that the more information you can supply to us, the more
  1505. likely it is that we can fix the problem!
  1506. @node Common programs, Problems, ODBC, Top
  1507. @chapter Using MySQL with Some Common Programs
  1508. @menu
  1509. * Apache::                      Using @strong{MySQL} with Apache
  1510. * Borland C++::                 
  1511. @end menu
  1512. @cindex Apache
  1513. @node Apache, Borland C++, Common programs, Common programs
  1514. @section Using MySQL with Apache
  1515. The contrib section includes programs that let you authenticate your
  1516. users from a @strong{MySQL} database and also let you log your log files
  1517. into a @strong{MySQL} table. @xref{Contrib}.
  1518. You can change the Apache logging format to be easily readable by
  1519. @strong{MySQL} by putting the following into the Apache configuration file:
  1520. @example
  1521. LogFormat 
  1522.         ""%h",%@{%Y%m%d%H%M%S@}t,%>s,"%b","%@{Content-Type@}o",  
  1523.         "%U","%@{Referer@}i","%@{User-Agent@}i""
  1524. @end example
  1525. In @strong{MySQL} you can do something like this:
  1526. @example
  1527. LOAD DATA INFILE '/local/access_log' INTO TABLE table_name
  1528. FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\'
  1529. @end example
  1530. @cindex Borland C++ compiler
  1531. @node Borland C++,  , Apache, Common programs
  1532. @section Borland C++
  1533. You can compile the @strong{MySQL} windows source with Borland C++ 5.02.
  1534. (The windows source includes only projects for Microsoft VC++, for
  1535. Borland C++ you have to do the project files yourself).
  1536. One known problem with Borland C++ is that it uses a different structure
  1537. alignment than VC++.  This means that you will run into problems if you
  1538. try to use the default @code{libmysql.dll} libraries (that was compiled
  1539. with VC++) with Borland C++. You can do one of the following to avoid
  1540. this problem.
  1541. @itemize @bullet
  1542. @item
  1543. You can use the static @strong{MySQL} libraries for Borland C++ that you
  1544. can find on @uref{http://www.mysql.net/downloads/os-win32.html}.
  1545. @item
  1546. Only call @code{mysql_init()} with @code{NULL} as an argument, not a
  1547. pre-allocated MYSQL struct.
  1548. @end itemize
  1549. @cindex problems, common errors
  1550. @cindex errors, common
  1551. @node Problems, Common problems, Common programs, Top
  1552. @chapter Problems and Common Errors
  1553. @menu
  1554. * What is crashing::            How to determine what is causing problems
  1555. * Crashing::                    What to do if @strong{MySQL} keeps crashing
  1556. * Link errors::                 Problems when linking with the @strong{MySQL} client library
  1557. * Common errors::               Some common errors when using @strong{MySQL}
  1558. * Full disk::                   How @strong{MySQL} handles a full disk
  1559. * Multiple sql commands::       How to run SQL commands from a text file
  1560. * Temporary files::             Where @strong{MySQL} stores temporary files
  1561. * Problems with mysql.sock::    How to protect @file{/tmp/mysql.sock}
  1562. * Changing MySQL user::         How to run @strong{MySQL} as a normal user
  1563. * Resetting permissions::       How to reset a forgotten password.
  1564. * File permissions ::           Problems with file permissions
  1565. * Not enough file handles::     File not found
  1566. * Using DATE::                  Problems using @code{DATE} columns
  1567. * Timezone problems::           Timezone problems
  1568. * Case sensitivity::            Case sensitivity in searches
  1569. * Problems with NULL::          Problems with @code{NULL} values
  1570. * Problems with alias::         Problems with @code{alias}
  1571. * Deleting from related tables::  Deleting rows from related tables
  1572. * No matching rows::            Solving problems with no matching rows
  1573. * ALTER TABLE problems::        Problems with @code{ALTER TABLE}.
  1574. * Change column order::         How to change the order of columns in a table
  1575. @end menu
  1576. @node What is crashing, Crashing, Problems, Problems
  1577. @section How to Determine What Is Causing Problems
  1578. When you run into problems, the first thing you should do is to find out
  1579. which program / piece of equipment is causing problems:
  1580. @itemize @bullet
  1581. @item
  1582. If you have one of the following symptoms, then it is probably a hardware
  1583. (like memory, motherboard, CPU, or hard disk) or kernel problem:
  1584. @itemize @minus
  1585. @item
  1586. The keyboard doesn't work.  This can normally be checked by pressing
  1587. Caps Lock. If the Caps Lock light doesn't change you have to replace
  1588. your keyboard.  (Before doing this, you should try to reboot
  1589. your computer and check all cables to the keyboard.)
  1590. @item
  1591. The mouse pointer doesn't move.
  1592. @item
  1593. The machine doesn't answer to a remote machine's pings.
  1594. @item
  1595. Different, unrelated programs don't behave correctly.
  1596. @item
  1597. If your system rebooted unexpectedly (a faulty user level program should
  1598. NEVER be able to take down your system).
  1599. @end itemize
  1600. In this case you should start by checking all your cables and run some
  1601. diagnostic tool to check your hardware!
  1602. You should also check if there are any patches, updates, or service
  1603. packs for your operating system that could likely solve your problems.
  1604. Check also that all your libraries (like glibc) are up to date.
  1605. It's always good to use a machine with ECC memory to discover
  1606. memory problems early!
  1607. @item
  1608. If your keyboard is locked up, you may be able to fix this by
  1609. logging into your machine from another machine and execute
  1610. @code{kbd_mode -a} on it.
  1611. @item
  1612. Please examine your system log file (/var/log/messages or similar) for
  1613. reasons for your problems.  If you think the problem is in @strong{MySQL}
  1614. then you should also examine @strong{MySQL}'s log files. @xref{Update log}.
  1615. @item
  1616. If you don't think you have hardware problems, you should try to find
  1617. out which program is causing problems.
  1618. Try using @code{top}, @code{ps}, @code{taskmanager}, or some similar program,
  1619. to check which program is taking all CPU or is locking the machine.
  1620. @item
  1621. Check with @code{top}, @code{df}, or a similar program if you are out of
  1622. memory, disk space, open files, or some other critical resource.
  1623. @item
  1624. If the problem is some runaway process, you can always try to kill it. If it
  1625. doesn't want to die, there is probably a bug in the operating system.
  1626. @end itemize
  1627. If after you have examined all other possibilities and you have
  1628. concluded that it's the @strong{MySQL} server or a @strong{MySQL} client
  1629. that is causing the problem, it's time to do a bug report for our
  1630. mailing list or our support team.  In the bug report, try to give a
  1631. very detailed description of how the system is behaving and what you think is
  1632. happening. You should also state why you think it's @strong{MySQL} that
  1633. is causing the problems.  Take into consideration all the situations in
  1634. this chapter. State any problems exactly how they appear when you
  1635. examine your system. Use the 'cut and paste' method for any output
  1636. and/or error messages from programs and/or log files!
  1637. Try to describe in detail which program is not working and all
  1638. symptoms you see!  We have in the past received many bug reports that just
  1639. state "the system doesn't work".  This doesn't provide us with any
  1640. information about what could be the problem.
  1641. If a program fails, it's always useful to know:
  1642. @itemize @bullet
  1643. @item
  1644. Has the program in question made a segmentation fault (core dumped)?
  1645. @item
  1646. Is the program taking the whole CPU? Check with @code{top}. Let the
  1647. program run for a while, it may be evaluating something heavy.
  1648. @item
  1649. If it's the @code{mysqld} server that is causing problems, can you
  1650. do @code{mysqladmin -u root ping} or @code{mysqladmin -u root processlist}?
  1651. @item
  1652. What does a client program say (try with @code{mysql}, for example)
  1653. when you try to connect to the @strong{MySQL} server?
  1654. Does the client jam?  Do you get any output from the program?
  1655. @end itemize
  1656. When sending a bug report, you should of follow the outlines
  1657. described in this manual. @xref{Asking questions}.
  1658. @cindex crash, repeated
  1659. @node Crashing, Link errors, What is crashing, Problems
  1660. @section What to Do if MySQL Keeps Crashing
  1661. All @strong{MySQL} versions are tested on many platforms before they are
  1662. released.  This doesn't mean that there aren't any bugs in
  1663. @strong{MySQL}, but it means if there are bugs, they are very few and can be
  1664. hard to find.  If you have a problem, it will always help if you try to
  1665. find out exactly what crashes your system, as you will have a much better
  1666. chance of getting this fixed quickly.
  1667. First, you should try to find out whether the problem is that the
  1668. @code{mysqld} daemon dies or whether your problem has to do with your
  1669. client.  You can check how long your @code{mysqld} server has been up by
  1670. executing @code{mysqladmin version}.  If @code{mysqld} has died, you may
  1671. find the reason for this in the file
  1672. @file{mysql-data-directory/`hostname`.err}. @xref{Error log}.
  1673. Many crashes of @strong{MySQL} are caused by corrupted index / data
  1674. files.  @strong{MySQL} will update the data on disk, with the
  1675. @code{write()} system call, after every SQL statement and before the
  1676. client is notified about the result. (This is not true if you are running
  1677. with @code{delayed_key_writes}, in which case only the data is written.)
  1678. This means that the data is safe even if mysqld crashes, as the OS will
  1679. ensure that the not flushed data is written to disk.  You can force
  1680. @strong{MySQL} to sync everything to disk after every SQL command by
  1681. starting @code{mysqld} with @code{--flush}.
  1682. The above means that normally you shouldn't get corrupted tables unless:
  1683. @itemize @bullet
  1684. @item
  1685. Someone/something killed @code{mysqld} or the machine in the middle
  1686. of an update.
  1687. @item
  1688. You have found a bug in @code{mysqld} that caused it to die in the
  1689. middle of an update.
  1690. @item
  1691. Someone is manipulating the data/index files outside of @strong{mysqld}
  1692. without locking the table properly.
  1693. @item
  1694. If you are running many @code{mysqld} servers on the same data on a
  1695. system that doesn't support good file system locks (normally handled by
  1696. the @code{lockd} deamon ) or if you are running
  1697. multiple servers with @code{--skip-locking}
  1698. @item
  1699. You have a crashed index/data file that contains very wrong data that
  1700. got mysqld confused.
  1701. @item
  1702. You have found a bug in the data storage code. This isn't that likely,
  1703. but it's at least possible.  In this case you can try to change the file
  1704. type to another database handler by using @code{ALTER TABLE} on a
  1705. repaired copy of the table!
  1706. @end itemize
  1707. Because it is very difficult to know why something is crashing, first try to
  1708. check whether or not things that work for others crash for you.  Please try
  1709. the following things:
  1710. @itemize @bullet
  1711. @item
  1712. Take down the @code{mysqld} daemon with @code{mysqladmin shutdown}, run
  1713. @code{myisamchk --silent --force */*.MYI} on all tables, and restart the
  1714. @code{mysqld} daemon.  This will ensure that you are running from a clean
  1715. state.  @xref{Maintenance}.
  1716. @item
  1717. Use @code{mysqld --log} and try to determine from the information in the log
  1718. whether or not some specific query kills the server. About 95% of all bugs are
  1719. related to a particular query!  Normally this is one of the last queries in
  1720. the log file just before @strong{MySQL} restarted. @xref{Query log}.
  1721. If you can repeatadly kill @strong{MySQL} with one of the queries, even
  1722. when you have checked all tables just before doing the query, then you
  1723. have been able to locate the bug and should do a bug report for this!
  1724. @xref{Bug reports}.
  1725. @item
  1726. Try to make a test case that we can use to reproduce the problem.
  1727. @xref{Reproducable test case}.
  1728. @item
  1729. Try running the included mysql-test test and the @strong{MySQL}
  1730. benchmarks.  @xref{MySQL test suite}.  They should test @strong{MySQL}
  1731. rather well.  You can also add code that to the benchmarks to simulates
  1732. your application!  The benchmarks can be found in the @file{bench}
  1733. directory in the source distribution or, for a binary distribution, in
  1734. the @file{sql-bench} directory under your @strong{MySQL} installation
  1735. directory.
  1736. @item
  1737. Try @code{fork_test.pl} and @code{fork2_test.pl}.
  1738. @item
  1739. If you configure @strong{MySQL} for debugging, it will be much easier to
  1740. gather information about possible errors if something goes wrong.
  1741. Reconfigure @strong{MySQL} with the @code{--with-debug} option to
  1742. @code{configure} and then recompile.  @xref{Debugging server}.
  1743. @item
  1744. Configuring @strong{MySQL} for debugging causes a safe memory allocator to be
  1745. included that can find some errors. It also provides a lot of output about
  1746. what is happening.
  1747. @item
  1748. Have you applied the latest patches for your operating system?
  1749. @item
  1750. Use the @code{--skip-locking} option to @code{mysqld}.  On some systems, the
  1751. @code{lockd} lock manager does not work properly; the @code{--skip-locking}
  1752. option tells @code{mysqld} not to use external locking.  (This means that you
  1753. cannot run 2 @code{mysqld} servers on the same data and that you must be
  1754. careful if you use @code{myisamchk}, but it may be instructive to try the
  1755. option as a test.)
  1756. @item
  1757. Have you tried @code{mysqladmin -u root processlist} when @code{mysqld}
  1758. appears to be running but not responding?  Sometimes @code{mysqld} is not
  1759. comatose even though you might think so.  The problem may be that all
  1760. connections are in use, or there may be some internal lock problem.
  1761. @code{mysqladmin processlist} will usually be able to make a connection even
  1762. in these cases, and can provide useful information about the current number
  1763. of connections and their status.
  1764. @item
  1765. Run the command @code{mysqladmin -i 5 status} or @code{mysqladmin -i 5
  1766. -r status} or in a separate window to produce statistics while you run
  1767. your other queries.
  1768. @item
  1769. Try the following:
  1770. @enumerate
  1771. @item
  1772. Start @code{mysqld} from @code{gdb} (or in another debugger).
  1773. @item
  1774. Run your test scripts.
  1775. @item
  1776. Print the backtrace and the local variables at the 3 lowest levels. In gdb you
  1777. can do this with the following commands when @code{mysqld} has crashed inside
  1778. gdb:
  1779. @example
  1780. backtrace
  1781. info local
  1782. up
  1783. info local
  1784. up
  1785. info local
  1786. @end example
  1787. With gdb you can also examine which threads exist with @code{info
  1788. threads} and switch to a specific thread with @code{thread #}, where
  1789. @code{#} is the thread id.
  1790. @end enumerate
  1791. @item
  1792. Try to simulate your application with a Perl script to force
  1793. @strong{MySQL} to crash or misbehave.
  1794. @item
  1795. Send a normal bug report. @xref{Bug reports}. Be even more detailed
  1796. than usual.  Because @strong{MySQL} works for many people, it may be that the
  1797. crash results from something that exists only on your computer (for example,
  1798. an error that is related to your particular system libraries).
  1799. @item
  1800. If you have a problem with tables with dynamic-length rows and you are
  1801. not using @code{BLOB/TEXT} columns (but only @code{VARCHAR} columns), you
  1802. can try to change all @code{VARCHAR} to @code{CHAR} with @code{ALTER
  1803. TABLE}.  This will force @strong{MySQL} to use fixed-size rows.
  1804. Fixed-size rows take a little extra space, but are much more tolerant to
  1805. corruption!
  1806. The current dynamic row code has been in use at MySQL AB for at least 3
  1807. years without any problems, but by nature dynamic-length rows are more
  1808. prone to errors, so it may be a good idea to try the above to see if it helps!
  1809. @end itemize
  1810. @cindex linking, errors
  1811. @cindex errors, linking
  1812. @cindex problems, linking
  1813. @node Link errors, Common errors, Crashing, Problems
  1814. @section Problems When Linking with the MySQL Client Library
  1815. If you are linking your program and you get errors for unreferenced
  1816. symbols that start with @code{mysql_}, like the following:
  1817. @example
  1818. /tmp/ccFKsdPa.o: In function `main':
  1819. /tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init'
  1820. /tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect'
  1821. /tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect'
  1822. /tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error'
  1823. /tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
  1824. @end example
  1825. you should be able to solve this by adding @code{-Lpath-to-the-mysql-library
  1826. -lmysqlclient} @strong{LAST} on your link line.
  1827. If you get @code{undefined reference} errors for the @code{uncompress}
  1828. or @code{compress} function, add @code{-lgz} @strong{LAST} on your link
  1829. line and try again!
  1830. If you get @code{undefined reference} errors for functions that should
  1831. exist on your system, like @code{connect}, check the man page for the
  1832. function in question, for which libraries you should add to the link
  1833. line!
  1834. If you get @code{undefined reference} errors for functions that don't
  1835. exist on your system, like the following:
  1836. @example
  1837. mf_format.o(.text+0x201): undefined reference to `__lxstat'
  1838. @end example
  1839. it usually means that your library is compiled on a system that is not
  1840. 100 % compatible with yours.  In this case you should download the
  1841. latest @strong{MySQL} source distribution and compile this yourself.
  1842. @xref{Installing source}.
  1843. If you are trying to run a program and you then get errors for
  1844. unreferenced symbols that start with @code{mysql_} or that the
  1845. @code{mysqlclient} library can't be found, this means that your system
  1846. can't find the share @code{libmysqlclient.so} library.
  1847. The fix for this is to tell your system to search after shared
  1848. libraries where the library is located by one of the following methods:
  1849. @itemize @bullet
  1850. @item
  1851. Add the path to the directory where you have @code{libmysqlclient.so} the
  1852. @code{LD_LIBRARY_PATH} environment variable.
  1853. @item
  1854. Add the path to the directory where you have @code{libmysqlclient.so} the
  1855. @code{LD_LIBRARY} environment variable.
  1856. @item
  1857. Copy @code{libmysqlclient.so} to some place that is searched by your system,
  1858. like @file{/lib}, and update the shared library information by executing
  1859. @code{ldconfig}.
  1860. @end itemize
  1861. Another way to solve this problem is to link your program statically, with
  1862. @code{-static}, or by removing the dynamic @strong{MySQL} libraries
  1863. before linking your code. In the second case you should be
  1864. sure that no other programs are using the dynamic libraries!
  1865. @cindex errors, list of
  1866. @node Common errors, Full disk, Link errors, Problems
  1867. @section Some Common Errors When Using MySQL
  1868. @menu
  1869. * Error Access denied::         @code{Access denied} Error
  1870. * Gone away::                   @code{MySQL server has gone away} error
  1871. * Can not connect to server::   @code{Can't connect to [local] MySQL server} error
  1872. * Blocked host::                @code{Host '...' is blocked} error
  1873. * Too many connections::        @code{Too many connections} error
  1874. * Non-transactional tables::    @code{Some non-transactional changed tables couldn't be rolled back} Error
  1875. * Out of memory::               @code{Out of memory} error
  1876. * Packet too large::            @code{Packet too large} error
  1877. * Communication errors::        Communication errors / Aborted connection
  1878. * Full table::                  @code{The table is full} error
  1879. * Cannot create::               @code{Can't create/write to file} Error
  1880. * Commands out of sync::        @code{Commands out of sync} error in client
  1881. * Ignoring user::               @code{Ignoring user} error
  1882. * Cannot find table::           @code{Table 'xxx' doesn't exist} error
  1883. * Cannot initialize character set::  
  1884. @end menu
  1885. @cindex errors, access denied
  1886. @cindex problems, access denied errors
  1887. @cindex access denied errors
  1888. @node Error Access denied, Gone away, Common errors, Common errors
  1889. @subsection @code{Access denied} Error
  1890. @xref{Privileges}, and especially see @xref{Access denied}.
  1891. @node Gone away, Can not connect to server, Error Access denied, Common errors
  1892. @subsection @code{MySQL server has gone away} Error
  1893. This section also covers the related @code{Lost connection to server
  1894. during query} error.
  1895. The most common reason for the @code{MySQL server has gone away} error
  1896. is that the server timed out and closed the connection. By default, the
  1897. server closes the connection after 8 hours if nothing has happened. You
  1898. can change the time limit by setting the @code{wait_timeout} variable when
  1899. you start mysqld.
  1900. You can check that the @strong{MySQL} hasn't died by executing
  1901. @code{mysqladmin version} and examining the uptime.
  1902. If you have a script, you just have to issue the query again for the client
  1903. to do an automatic reconnection.
  1904. You normally can get the following error codes in this case
  1905. (which one you get is OS-dependent):
  1906. @multitable @columnfractions .3 .7
  1907. @item @code{CR_SERVER_GONE_ERROR} @tab The client couldn't send a question to the
  1908. server.
  1909. @item @code{CR_SERVER_LOST} @tab  The client didn't get an error when writing
  1910. to the server, but it didn't get a full answer (or any answer) to the question.
  1911. @end multitable
  1912. You can also get these errors if you send a query to the server that is
  1913. incorrect or too large. If @code{mysqld} gets a packet that is too large
  1914. or out of order, it assumes that something has gone wrong with the client and
  1915. closes the connection.  If you need big queries (for example, if you are
  1916. working with big @code{BLOB} columns), you can increase the query limit by
  1917. starting @code{mysqld} with the @code{-O max_allowed_packet=#} option
  1918. (default 1M). The extra memory is allocated on demand, so @code{mysqld} will
  1919. use more memory only when you issue a big query or when @code{mysqld} must
  1920. return a big result row!
  1921. @node Can not connect to server, Blocked host, Gone away, Common errors
  1922. @subsection @code{Can't connect to [local] MySQL server} error
  1923. A @strong{MySQL} client on Unix can connect to the @code{mysqld} server in two
  1924. different ways: Unix sockets, which connect through a file in the file
  1925. system (default @file{/tmp/mysqld.sock}) or TCP/IP, which connects
  1926. through a port number.  Unix sockets are faster than TCP/IP but can only
  1927. be used when connecting to a server on the same computer.  Unix sockets
  1928. are used if you don't specify a hostname or if you specify the special
  1929. hostname @code{localhost}.
  1930. On Windows you can connect only with TCP/IP if the @code{mysqld} server
  1931. is running on Win95/Win98. If it's running on NT, you can also connect
  1932. with named pipes.  The name of the named pipe is @strong{MySQL}.  If you
  1933. don't give a hostname when connecting to @code{mysqld}, a @strong{MySQL} client
  1934. will first try to connect to the named pipe, and if this doesn't work it
  1935. will connect to the TCP/IP port.  You can force the use of named pipes
  1936. on Windows by using @code{.} as the hostname.
  1937. The error (2002) @code{Can't connect to ...} normally means that there
  1938. isn't a @strong{MySQL} server running on the system or that you are
  1939. using a wrong socket file or TCP/IP port when trying to connect to the
  1940. @code{mysqld} server.
  1941. Start by checking (using @code{ps} or the task manager on Windows) that
  1942. there is a process running named @code{mysqld} on your server!  If there
  1943. isn't any @code{mysqld} process, you should start one. @xref{Starting
  1944. server}.
  1945. If a @code{mysqld} process is running, you can check the server by
  1946. trying these different connections (the port number and socket pathname
  1947. might be different in your setup, of course):
  1948. @example
  1949. shell> mysqladmin version
  1950. shell> mysqladmin variables
  1951. shell> mysqladmin -h `hostname` version variables
  1952. shell> mysqladmin -h `hostname` --port=3306 version
  1953. shell> mysqladmin -h 'ip for your host' version
  1954. shell> mysqladmin --socket=/tmp/mysql.sock version
  1955. @end example
  1956. Note the use of backquotes rather than forward quotes with the @code{hostname}
  1957. command; these cause the output of @code{hostname} (that is, the current
  1958. hostname) to be substituted into the @code{mysqladmin} command.
  1959. Here are some reasons the @code{Can't connect to local MySQL server}
  1960. error might occur:
  1961. @itemize @bullet
  1962. @item
  1963. @code{mysqld} is not running.
  1964. @item
  1965. You are running on a system that uses MIT-pthreads.
  1966. If you are running on a system that doesn't have native threads,
  1967. @code{mysqld} uses the MIT-pthreads package.  @xref{Which OS}.  However,
  1968. all MIT-pthreads versions doesn't support Unix sockets. On a system
  1969. without sockets support you must always specify the hostname explicitly
  1970. when connecting to the server. Try using this command to check the
  1971. connection to the server:
  1972. @example
  1973. shell> mysqladmin -h `hostname` version
  1974. @end example
  1975. @item
  1976. Someone has removed the Unix socket that @code{mysqld} uses (default
  1977. @file{/tmp/mysqld.sock}).  You might have a @code{cron} job that removes
  1978. the @strong{MySQL} socket (for example, a job that removes old files
  1979. from the @file{/tmp} directory).  You can always run @code{mysqladmin
  1980. version} and check that the socket @code{mysqladmin} is trying to use
  1981. really exists.  The fix in this case is to change the @code{cron} job to
  1982. not remove @file{mysqld.sock} or to place the socket somewhere else. You
  1983. can specify a different socket location at @strong{MySQL} configuration
  1984. time with this command:
  1985. @example
  1986. shell> ./configure --with-unix-socket-path=/path/to/socket
  1987. @end example
  1988. You can also start @code{safe_mysqld} with the
  1989. @code{--socket=/path/to/socket} option and set the environment variable
  1990. @code{MYSQL_UNIX_PORT} to the socket pathname before starting your
  1991. @strong{MySQL} clients.
  1992. @item
  1993. You have started the @code{mysqld} server with
  1994. the @code{--socket=/path/to/socket} option.  If you change the socket
  1995. pathname for the server, you must also notify the @strong{MySQL} clients
  1996. about the new path. You can do this by setting the environment variable
  1997. @code{MYSQL_UNIX_PORT} to the socket pathname or by providing the socket path
  1998. as an argument to the clients. You can test the socket with this command:
  1999. @example
  2000. shell> mysqladmin --socket=/path/to/socket version
  2001. @end example
  2002. @item
  2003. You are using Linux and one thread has died (core dumped).  In this case
  2004. you must kill the other @code{mysqld} threads (for example, with the
  2005. @code{mysql_zap} script before you can start a new @strong{MySQL}
  2006. server.  @xref{Crashing}.
  2007. @item
  2008. You may not have read and write privilege to either the directory that holds
  2009. the socket file or privilege to the socket file itself. In this case you
  2010. have to either change the privilege for the directory / file or restart
  2011. @code{mysqld} so that it uses a directory that you can access.
  2012. @end itemize
  2013. If you get the error message @code{Can't connect to MySQL server on
  2014. some_hostname}, you can try the following things to find out what the
  2015. problem is :
  2016. @itemize @bullet
  2017. @item
  2018. Check if the server is up by doing @code{telnet your-host-name
  2019. tcp-ip-port-number} and press @code{RETURN} a couple of times.  If there
  2020. is a @strong{MySQL} server running on this port you should get a
  2021. responses that includes the version number of the running @strong{MySQL}
  2022. server.  If you get an error like @code{telnet: Unable to connect to
  2023. remote host: Connection refused}, then there is no server running on the
  2024. given port.
  2025. @item
  2026. Try connecting to the @code{mysqld} daemon on the local machine and check
  2027. the TCP/IP port that mysqld it's configured to use (variable @code{port}) with
  2028. @code{mysqladmin variables}.
  2029. @item
  2030. Check that your @code{mysqld} server is not started with the
  2031. @code{--skip-networking} option.
  2032. @end itemize
  2033. @node Blocked host, Too many connections, Can not connect to server, Common errors
  2034. @subsection @code{Host '...' is blocked} Error
  2035. If you get an error like this:
  2036. @example
  2037. Host 'hostname' is blocked because of many connection errors.
  2038. Unblock with 'mysqladmin flush-hosts'
  2039. @end example
  2040. this means that @code{mysqld} has gotten a lot (@code{max_connect_errors})
  2041. of connect requests from the host @code{'hostname'} that have been interrupted
  2042. in the middle. After @code{max_connect_errors} failed requests, @code{mysqld}
  2043. assumes that something is wrong (like an attack from a cracker), and
  2044. blocks the site from further connections until someone executes the command
  2045. @code{mysqladmin flush-hosts}.
  2046. By default, @code{mysqld} blocks a host after 10 connection errors.
  2047. You can easily adjust this by starting the server like this:
  2048. @example
  2049. shell> safe_mysqld -O max_connect_errors=10000 &
  2050. @end example
  2051. Note that if you get this error message for a given host, you should first
  2052. check that there isn't anything wrong with TCP/IP connections from that
  2053. host.  If your TCP/IP connections aren't working, it won't do you any good to
  2054. increase the value of the @code{max_connect_errors} variable!
  2055. @node Too many connections, Non-transactional tables, Blocked host, Common errors
  2056. @subsection @code{Too many connections} Error
  2057. If you get the error @code{Too many connections} when you try to connect
  2058. to @strong{MySQL}, this means that there is already @code{max_connections}
  2059. clients connected to the @code{mysqld} server.
  2060. If you need more connections than the default (100), then you should restart
  2061. @code{mysqld} with a bigger value for the @code{max_connections} variable.
  2062. Note that @code{mysqld} actually allows (@code{max_connections}+1)
  2063. clients to connect.  The last connection is reserved for a user with the
  2064. @strong{process} privilege.  By not giving this privilege to normal
  2065. users (they shouldn't need this), an administrator with this privilege
  2066. can log in and use @code{SHOW PROCESSLIST} to find out what could be
  2067. wrong. @xref{SHOW}.
  2068. The maximum number of connects @strong{MySQL} is depending on how good
  2069. the thread library is on a given platform. Linux or Solaris should be
  2070. able to support 500-1000 simultaneous connections, depending on how much
  2071. RAM you have and what your clients are doing.
  2072. @cindex Non-transactional tables
  2073. @node Non-transactional tables, Out of memory, Too many connections, Common errors
  2074. @subsection @code{Some non-transactional changed tables couldn't be rolled back} Error
  2075. If you get the error/warning: @code{Warning: Some non-transactional
  2076. changed tables couldn't be rolled back} when trying to do a
  2077. @code{ROLLBACK}, this means that some of the tables you used in the
  2078. transaction didn't support transactions.  These non-transactional tables
  2079. will not be affected by the @code{ROLLBACK} statement.
  2080. The most typical case when this happens is when you have tried to create
  2081. a table of a type that is not supported by your @code{mysqld} binary.
  2082. If @code{mysqld} doesn't support a table type (or if the table type is
  2083. disabled by a startup option) , it will instead create the table type
  2084. with the table type that is most resembles to the one you requested,
  2085. probably @code{MyISAM}.
  2086. You can check the table type for a table by doing:
  2087. @code{SHOW TABLE STATUS LIKE 'table_name'}. @xref{SHOW TABLE STATUS}.
  2088. You can check the extensions your @code{mysqld} binary supports by doing:
  2089. @code{show variables like 'have_%'}. @xref{SHOW VARIABLES}.
  2090. @node Out of memory, Packet too large, Non-transactional tables, Common errors
  2091. @subsection @code{Out of memory} Error
  2092. If you issue a query and get something like the following error:
  2093. @example
  2094. mysql: Out of memory at line 42, 'malloc.c'
  2095. mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
  2096. ERROR 2008: MySQL client ran out of memory
  2097. @end example
  2098. note that the error refers to the @strong{MySQL} client @code{mysql}. The
  2099. reason for this error is simply that the client does not have enough memory to
  2100. store the whole result.
  2101. To remedy the problem, first check that your query is correct. Is it
  2102. reasonable that it should return so many rows?  If so,
  2103. you can use @code{mysql --quick}, which uses @code{mysql_use_result()}
  2104. to retrieve the result set.  This places less of a load on the client (but
  2105. more on the server).
  2106. @node Packet too large, Communication errors, Out of memory, Common errors
  2107. @subsection @code{Packet too large} Error
  2108. When a @strong{MySQL} client or the @code{mysqld} server gets a packet bigger
  2109. than @code{max_allowed_packet} bytes, it issues a @code{Packet too large}
  2110. error and closes the connection.
  2111. If you are using the @code{mysql} client, you may specify a bigger buffer by
  2112. starting the client with @code{mysql --set-variable=max_allowed_packet=8M}.
  2113. If you are using other clients that do not allow you to specify the maximum
  2114. packet size (such as @code{DBI}), you need to set the packet size when you
  2115. start the server.  You cau use a command-line option to @code{mysqld} to set
  2116. @code{max_allowed_packet} to a larger size.  For example, if you are
  2117. expecting to store the full length of a @code{BLOB} into a table, you'll need
  2118. to start the server with the @code{--set-variable=max_allowed_packet=16M}
  2119. option.
  2120. @cindex aborted clients
  2121. @cindex aborted connection
  2122. @cindex connection, aborted
  2123. @node Communication errors, Full table, Packet too large, Common errors
  2124. @subsection Communication Errors / Aborted Connection
  2125. If you find errors like the following in your error log.
  2126. @example
  2127. 010301 14:38:23  Aborted connection 854 to db: 'users' user: 'josh'
  2128. @end example
  2129. @xref{Error log}.
  2130. This means that something of the following has happened:
  2131. @itemize @bullet
  2132. @item
  2133. The client program did not call @code{mysql_close()} before exit.
  2134. @item
  2135. The client had been sleeping more than @code{wait_timeout} or
  2136. @code{interactive_timeout} without doing any requests. @xref{SHOW
  2137. VARIABLES}.
  2138. @item
  2139. The client program ended abruptly in the middle of the transfer.
  2140. @end itemize
  2141. When the above happens, the server variable @code{Aborted_clients} is
  2142. incremented.
  2143. The server variable @code{Aborted_connects} is incremented when:
  2144. @itemize @bullet
  2145. @item
  2146. When a connection packet doesn't contain the right information.
  2147. @item
  2148. When the user didn't have privileges to connect to a database.
  2149. @item
  2150. When a user uses a wrong password.
  2151. @item
  2152. When it takes more than @code{connect_timeout} seconds to get
  2153. a connect package.
  2154. @end itemize
  2155. Note that the above could indicate that someone is trying to break into
  2156. your database!
  2157. @xref{SHOW VARIABLES}.
  2158. Other reason for problems with Aborted clients / Aborted connections.
  2159. @itemize @bullet
  2160. @item
  2161. Usage of duplex Ethernet protocol, both half and full with
  2162. Linux. Many Linux Ethernet drivers have this bug. You should test
  2163. for this bug by transferring a huge file via ftp between these two
  2164. machines. If a transfer goes in burst-pause-burst-pause ... mode then
  2165. you are experiencing a Linux duplex syndrome. The only solution to
  2166. this problem is switching of both half and full duplexing on hubs
  2167. and switches.
  2168. @item
  2169. Some problem with the thread library that causes interrupts on reads.
  2170. @item
  2171. Badly configured TCP/IP.
  2172. @item
  2173. Faulty Ethernets or hubs or switches, cables ... This can be diagnosed
  2174. properly only by replacing hardware.
  2175. @end itemize
  2176. @cindex table is full
  2177. @node Full table, Cannot create, Communication errors, Common errors
  2178. @subsection @code{The table is full} Error
  2179. This error occurs in older @strong{MySQL} versions when an in-memory temporary
  2180. table becomes larger than @code{tmp_table_size} bytes. To avoid this
  2181. problem, you can use the @code{-O tmp_table_size=#} option to
  2182. @code{mysqld} to increase the temporary table size or use the SQL
  2183. option @code{SQL_BIG_TABLES} before you issue the problematic
  2184. query. @xref{SET OPTION, , @code{SET OPTION}}.
  2185. You can also start @code{mysqld} with the @code{--big-tables} option.
  2186. This is exactly the same as using @code{SQL_BIG_TABLES} for all queries.
  2187. In @strong{MySQL} Version 3.23, in-memory temporary tables will automatically be
  2188. converted to a disk-based @code{MyISAM} table after the table size gets
  2189. bigger than @code{tmp_table_size}.
  2190. @cindex can't create/write to file
  2191. @node Cannot create, Commands out of sync, Full table, Common errors
  2192. @subsection @code{Can't create/write to file} Error
  2193. If you get an error for some queries of type:
  2194. @example
  2195. Can't create/write to file '\sqla3fe_0.ism'.
  2196. @end example
  2197. this means that @strong{MySQL} can't create a temporary file for the
  2198. result set in the given temporary directory. (The above error is a
  2199. typical error message on Windows, and the Unix error message is similar.)
  2200. The fix is to start mysqld with @code{--tmpdir=path} or to add to your option
  2201. file:
  2202. @example
  2203. [mysqld]
  2204. tmpdir=C:/temp
  2205. @end example
  2206. assuming that the @file{c:\temp} directory exists. @xref{Option files}.
  2207. Check also the error code that you get with @code{perror}. One reason
  2208. may also be a disk full error;
  2209. @example
  2210. shell> perror 28
  2211. Error code  28:  No space left on device
  2212. @end example
  2213. @cindex commands out of sync
  2214. @node Commands out of sync, Ignoring user, Cannot create, Common errors
  2215. @subsection @code{Commands out of sync} Error in Client
  2216. If you get @code{Commands out of sync; You can't run this command now}
  2217. in your client code, you are calling client functions in the wrong order!
  2218. This can happen, for example, if you are using @code{mysql_use_result()} and
  2219. try to execute a new query before you have called @code{mysql_free_result()}.
  2220. It can also happen if you try to execute two queries that return data without
  2221. a @code{mysql_use_result()} or @code{mysql_store_result()} in between.
  2222. @node Ignoring user, Cannot find table, Commands out of sync, Common errors
  2223. @subsection @code{Ignoring user} Error
  2224. If you get the following error:
  2225. @code{Found wrong password for user: 'some_user@@some_host'; Ignoring user}
  2226. this means that when @code{mysqld} was started or when it reloaded the
  2227. permissions tables, it found an entry in the @code{user} table with
  2228. an invalid password.  As a result, the entry is simply ignored by the
  2229. permission system.
  2230. Possible causes of and fixes for this problem:
  2231. @itemize @bullet
  2232. @item
  2233. You may be running a new version of @code{mysqld} with an old
  2234. @code{user} table.
  2235. You can check this by executing @code{mysqlshow mysql user} to see if
  2236. the password field is shorter than 16 characters. If so, you can correct this
  2237. condition by running the @code{scripts/add_long_password} script.
  2238. @item
  2239. The user has an old password (8 chararacters long) and you didn't start
  2240. @code{mysqld} with the @code{--old-protocol} option.
  2241. Update the user in the @code{user} table with a new password or
  2242. restart @code{mysqld} with @code{--old-protocol}.
  2243. @item
  2244. @findex PASSWORD()
  2245. You have specified a password in the @code{user} table without using the
  2246. @code{PASSWORD()} function.  Use @code{mysql} to update the user in the
  2247. @code{user} table with a new password. Make sure to use the @code{PASSWORD()}
  2248. function:
  2249. @example
  2250. mysql> update user set password=PASSWORD('your password')
  2251.            where user='XXX';
  2252. @end example
  2253. @end itemize
  2254. @node Cannot find table, Cannot initialize character set, Ignoring user, Common errors
  2255. @subsection @code{Table 'xxx' doesn't exist} Error
  2256. If you get the error @code{Table 'xxx' doesn't exist} or @code{Can't
  2257. find file: 'xxx' (errno: 2)}, this means that no table exists
  2258. in the current database with the name @code{xxx}.
  2259. Note that as @strong{MySQL} uses directories and files to store databases and
  2260. tables, the database and table names are @strong{case sensitive}!
  2261. (On Windows the databases and tables names are not case sensitive, but all
  2262. references to a given table within a query must use the same case!)
  2263. You can check which tables you have in the current database with
  2264. @code{SHOW TABLES}. @xref{SHOW, , @code{SHOW}}.
  2265. @cindex multibyte character sets
  2266. @node Cannot initialize character set,  , Cannot find table, Common errors
  2267. @subsection @code{Can@'t initialize character set xxx} error.
  2268. If you get an error like:
  2269. @example
  2270. MySQL Connection Failed: Can't initialize character set xxx
  2271. @end example
  2272. This means one of the following things:
  2273. @itemize @bullet
  2274. @item
  2275. The character set is a multi-byte character set and you have not support
  2276. for the character set in the client.
  2277. In this case you need to recompile the client with
  2278. @code{--with-charset=xxx} or with @code{--with-extra-charsets=xxx}.
  2279. @xref{configure options}.
  2280. All standard @strong{MySQL} binaries are compiled with
  2281. @code{--with-extra-character-sets=complex} which will enable support for
  2282. all multi-byte character sets. @xref{Character sets}.
  2283. @item
  2284. The character set is a simple character set which is not compiled into
  2285. @code{mysqld} and the character set definition files is not in the place
  2286. where the client expect to find them.
  2287. In this case you need to:
  2288. @itemize @bullet
  2289. @item
  2290. Recompile the client with support for the character set.
  2291. @xref{configure options}.
  2292. @item
  2293. Specify to the client where the character set definition files are. For many
  2294. client you can do this with the
  2295. @code{--character-sets-dir=path-to-charset-dir} option.
  2296. @item
  2297. Copy the character definition files to the path where the client expect them
  2298. to be.
  2299. @end itemize
  2300. @end itemize
  2301. @cindex full disk
  2302. @cindex disk full
  2303. @node Full disk, Multiple sql commands, Common errors, Problems
  2304. @section How MySQL Handles a Full Disk
  2305. @noindent
  2306. When a disk-full condition occurs, @strong{MySQL} does the following:
  2307. @itemize @bullet
  2308. @item
  2309. It checks once every minute to see whether or not there is enough space to
  2310. write the current row. If there is enough space, it continues as if nothing had
  2311. happened.
  2312. @item
  2313. Every 6 minutes it writes an entry to the log file warning about the disk
  2314. full condition.
  2315. @end itemize
  2316. @noindent
  2317. To alleviate the problem, you can take the following actions:
  2318. @itemize @bullet
  2319. @item
  2320. To continue, you only have to free enough disk space to insert all records.
  2321. @item
  2322. To abort the thread, you must send a @code{mysqladmin kill} to the thread.
  2323. The thread will be aborted the next time it checks the disk (in 1 minute).
  2324. @item
  2325. Note that other threads may be waiting for the table that caused the disk
  2326. full condition.  If you have several ``locked'' threads, killing the one
  2327. thread that is waiting on the disk-full condition will allow the other
  2328. threads to continue.
  2329. @end itemize
  2330. @node Multiple sql commands, Temporary files, Full disk, Problems
  2331. @section How to Run SQL Commands from a Text File
  2332. The @code{mysql} client typically is used interactively, like this:
  2333. @example
  2334. shell> mysql database
  2335. @end example
  2336. However, it's also possible to put your SQL commands in a file and tell
  2337. @code{mysql} to read its input from that file.  To do so, create a text
  2338. file @file{text_file} that contains the commands you wish to execute.
  2339. Then invoke @code{mysql} as shown below:
  2340. @example
  2341. shell> mysql database < text_file
  2342. @end example
  2343. You can also start your text file with a @code{USE db_name} statement.  In
  2344. this case, it is unnecessary to specify the database name on the command
  2345. line:
  2346. @example
  2347. shell> mysql < text_file
  2348. @end example
  2349. @xref{Programs}.
  2350. @node Temporary files, Problems with mysql.sock, Multiple sql commands, Problems
  2351. @section Where MySQL Stores Temporary Files
  2352. @strong{MySQL} uses the value of the @code{TMPDIR} environment variable as
  2353. the pathname of the directory in which to store temporary files.  If you don't
  2354. have @code{TMPDIR} set, @strong{MySQL} uses the system default, which is
  2355. normally @file{/tmp} or @file{/usr/tmp}.  If the file system containing your
  2356. temporary file directory is too small, you should edit @code{safe_mysqld} to
  2357. set @code{TMPDIR} to point to a directory in a file system where you have
  2358. enough space!  You can also set the temporary directory using the
  2359. @code{--tmpdir} option to @code{mysqld}.
  2360. @strong{MySQL} creates all temporary files as hidden files. This ensures
  2361. that the temporary files will be removed if @code{mysqld} is terminated.  The
  2362. disadvantage of using hidden files is that you will not see a big temporary
  2363. file that fills up the file system in which the temporary file directory is
  2364. located.
  2365. When sorting (@code{ORDER BY} or @code{GROUP BY}), @strong{MySQL} normally
  2366. uses one or two temporary files. The maximum disk-space needed is:
  2367. @example
  2368. (length of what is sorted + sizeof(database pointer))
  2369. * number of matched rows
  2370. * 2
  2371. @end example
  2372. @code{sizeof(database pointer)} is usually 4, but may grow in the future for
  2373. really big tables.
  2374. For some @code{SELECT} queries, @strong{MySQL} also creates temporary SQL
  2375. tables. These are not hidden and have names of the form @file{SQL_*}.
  2376. @code{ALTER TABLE} creates a temporary table in the same directory as
  2377. the original table.
  2378. @cindex @code{mysql.sock}, protection
  2379. @cindex deletion, @code{mysql.sock}
  2380. @node  Problems with mysql.sock, Changing MySQL user, Temporary files, Problems
  2381. @section How to Protect @file{/tmp/mysql.sock} from Being Deleted
  2382. If you have problems with the fact that anyone can delete the
  2383. @strong{MySQL} communication socket @file{/tmp/mysql.sock}, you can,
  2384. on most versions of Unix, protect your @file{/tmp} file system by setting
  2385. the @code{sticky} bit on it.  Log in as @code{root} and do the following:
  2386. @example
  2387. shell> chmod +t /tmp
  2388. @end example
  2389. This will protect your @file{/tmp} file system so that files can be deleted
  2390. only by their owners or the superuser (@code{root}).
  2391. You can check if the @code{sticky} bit is set by executing @code{ls -ld /tmp}.
  2392. If the last permission bit is @code{t}, the bit is set.
  2393. @cindex starting, @code{mysqld}
  2394. @cindex @code{mysqld}, starting
  2395. @node Changing MySQL user, Resetting permissions, Problems with mysql.sock, Problems
  2396. @section How to Run MySQL As a Normal User
  2397. The @strong{MySQL} server @code{mysqld} can be started and run by any user.
  2398. In order to change @code{mysqld} to run as a Unix user @code{user_name}, you must
  2399. do the following:
  2400. @enumerate
  2401. @item
  2402. Stop the server if it's running (use @code{mysqladmin shutdown}).
  2403. @item
  2404. Change the database directories and files so that @code{user_name} has
  2405. privileges to read and write files in them (you may need to do this as
  2406. the Unix @code{root} user):
  2407. @example
  2408. shell> chown -R user_name /path/to/mysql/datadir
  2409. @end example
  2410. If directories or files within the @strong{MySQL} data directory are
  2411. symlinks, you'll also need to follow those links and change the directories
  2412. and files they point to.  @code{chown -R} may not follow symlinks for
  2413. you.
  2414. @item
  2415. Start the server as user @code{user_name}, or, if you are using
  2416. @strong{MySQL} Version 3.22 or later, start @code{mysqld} as the Unix @code{root}
  2417. user and use the @code{--user=user_name} option.  @code{mysqld} will switch
  2418. to run as the Unix user @code{user_name} before accepting any connections.
  2419. @item
  2420. If you are using the @code{mysql.server} script to start @code{mysqld} when
  2421. the system is rebooted, you should edit @code{mysql.server} to use @code{su}
  2422. to run @code{mysqld} as user @code{user_name}, or to invoke @code{mysqld}
  2423. with the @code{--user} option.  (No changes to @code{safe_mysqld} are
  2424. necessary.)
  2425. @end enumerate
  2426. At this point, your @code{mysqld} process should be running fine and dandy as
  2427. the Unix user @code{user_name}. One thing hasn't changed, though: the
  2428. contents of the permissions tables. By default (right after running the
  2429. permissions table install script @code{mysql_install_db}), the @strong{MySQL}
  2430. user @code{root} is the only user with permission to access the @code{mysql}
  2431. database or to create or drop databases.  Unless you have changed those
  2432. permissions, they still hold. This shouldn't stop you from accessing
  2433. @strong{MySQL} as the @strong{MySQL} @code{root} user when you're logged in
  2434. as a Unix user other than @code{root}; just specify the @code{-u root} option
  2435. to the client program.
  2436. Note that accessing @strong{MySQL} as @code{root}, by supplying @code{-u
  2437. root} on the command line, has @emph{nothing} to do with @strong{MySQL} running
  2438. as the Unix @code{root} user, or, indeed, as another Unix user. The access
  2439. permissions and user names of @strong{MySQL} are completely separate from
  2440. Unix user names. The only connection with Unix user names is that if you
  2441. don't provide a @code{-u} option when you invoke a client program, the client
  2442. will try to connect using your Unix login name as your @strong{MySQL} user
  2443. name.
  2444. If your Unix box itself isn't secured, you should probably at least put a
  2445. password on the @strong{MySQL} @code{root} users in the access tables.
  2446. Otherwise, any user with an account on that machine can run @code{mysql -u
  2447. root db_name} and do whatever he likes.
  2448. @cindex passwords, forgotten
  2449. @cindex passwords, resetting
  2450. @cindex root user, password resetting
  2451. @node Resetting permissions, File permissions , Changing MySQL user, Problems
  2452. @section How to Reset a Forgotten Password
  2453. If you have forgotten the @code{root} user password for @strong{MySQL}, you
  2454. can restore it with the following procedure:
  2455. @enumerate
  2456. @item
  2457. Take down the mysqld server by sending a @code{kill} (not @code{kill
  2458. -9}) to the @code{mysqld} server.  The pid is stored in a @code{.pid}
  2459. file, which is normally in the @strong{MySQL} database directory:
  2460. @example
  2461. kill `cat /mysql-data-directory/hostname.pid`
  2462. @end example
  2463. You must be either the Unix @code{root} user or the same user the server
  2464. runs as to do this.
  2465. @item
  2466. Restart @code{mysqld} with the @code{--skip-grant-tables} option.
  2467. @item
  2468. Connect to the mysqld server with @code{mysql -h hostname mysql} and change
  2469. the password with a @code{GRANT} command. @xref{GRANT,,@code{GRANT}}.
  2470. You can also do this with
  2471. @code{mysqladmin -h hostname -u user password 'new password'}
  2472. @item
  2473. Load the privilege tables with: @code{mysqladmin -h hostname
  2474. flush-privileges} or with the SQL command @code{FLUSH PRIVILEGES}.
  2475. @end enumerate
  2476. Note that after you started @code{mysqld} with @code{--skip-grant-tables},
  2477. any usage of @code{GRANT} commands will give you an @code{Unknown command}
  2478. error until you have executed @code{FLUSH PRIVILEGES}.
  2479. @cindex files, permissions
  2480. @cindex error mesaages, can't find file
  2481. @cindex files, not found message
  2482. @node File permissions , Not enough file handles, Resetting permissions, Problems
  2483. @section Problems with File Permissions
  2484. If you have problems with file permissions, for example, if @code{mysql}
  2485. issues the following error message when you create a table:
  2486. @example
  2487. ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
  2488. @end example
  2489. @tindex UMASK environment variable
  2490. @tindex Environment variable, UMASK
  2491. then the environment variable @code{UMASK} might be set incorrectly when
  2492. @code{mysqld} starts up.  The default umask value is @code{0660}. You can
  2493. change this behavior by starting @code{safe_mysqld} as follows:
  2494. @example
  2495. shell> UMASK=384  # = 600 in octal
  2496. shell> export UMASK
  2497. shell> /path/to/safe_mysqld &
  2498. @end example
  2499. @tindex UMASK_DIR environment variable
  2500. @tindex Environment variable, UMASK_DIR
  2501. By default @strong{MySQL} will create database and @code{RAID}
  2502. directories with permission type 0700.  You can modify this behavior by
  2503. setting the @code{UMASK_DIR} variable. If you set this, new
  2504. directories are created with the combined @code{UMASK} and
  2505. @code{UMASK_DIR}. For example, if you want to give group access to
  2506. all new directories, you can do:
  2507. @example
  2508. shell> UMASK_DIR=504  # = 770 in octal
  2509. shell> export UMASK_DIR
  2510. shell> /path/to/safe_mysqld &
  2511. @end example
  2512. In @strong{MySQL} Version 3.23.25 and above, @strong{MySQL} assumes that the
  2513. value for @code{UMASK} and @code{UMASK_DIR} is in octal if it starts
  2514. with a zero.
  2515. @xref{Environment variables}.
  2516. @node Not enough file handles, Using DATE, File permissions , Problems
  2517. @section File Not Found
  2518. If you get @code{ERROR '...' not found (errno: 23)}, @code{Can't open
  2519. file: ... (errno: 24)}, or any other error with @code{errno 23} or
  2520. @code{errno 24} from @strong{MySQL}, it means that you haven't allocated
  2521. enough file descriptors for @strong{MySQL}.  You can use the
  2522. @code{perror} utility to get a description of what the error number
  2523. means:
  2524. @example
  2525. shell> perror 23
  2526. File table overflow
  2527. shell> perror 24
  2528. Too many open files
  2529. @end example
  2530. The problem here is that @code{mysqld} is trying to keep open too many
  2531. files simultaneously.  You can either tell @code{mysqld} not to open so
  2532. many files at once or increase the number of file descriptors
  2533. available to @code{mysqld}.
  2534. To tell @code{mysqld} to keep open fewer files at a time, you can make
  2535. the table cache smaller by using the @code{-O table_cache=32} option to
  2536. @code{safe_mysqld} (the default value is 64). Reducing the value of
  2537. @code{max_connections} will also reduce the number of open files (the
  2538. default value is 90).
  2539. @tindex ulimit
  2540. To change the number of file descriptors available to @code{mysqld}, you
  2541. can use the option @code{--open-files-limit=#} to @code{safe_mysqld} or
  2542. @code{-O open-files-limit=#} to @code{mysqld}. @xref{SHOW VARIABLES}.
  2543. The easyest way to do that is to add the option to your option file.
  2544. @xref{Option files}.  If you have an old @code{mysqld} version that
  2545. doesn't support this, you can edit the @code{safe_mysqld} script.  There
  2546. is a commented-out line @code{ulimit -n 256} in the script.  You can
  2547. remove the @code{'#'} character to uncomment this line, and change the
  2548. number 256 to affect the number of file descriptors available to
  2549. @code{mysqld}.
  2550. @code{ulimit} (and @code{open-files-limit}) can increase the number of
  2551. file descriptors, but only up to the limit imposed by the operating
  2552. system. There is also a 'hard' limit that can only be overrided if you
  2553. start @code{safe_mysqld} or @code{mysqld} as root (Just remember that
  2554. you need to also use the @code{--user=..} option in this case).  If you
  2555. need to increase the OS limit on the number of file descriptors
  2556. available to each process, consult the documentation for your operating
  2557. system.
  2558. Note that if you run the @code{tcsh} shell, @code{ulimit} will not work!
  2559. @code{tcsh} will also report incorrect values when you ask for the current
  2560. limits!  In this case you should start @code{safe_mysqld} with @code{sh}!
  2561. @findex DATE
  2562. @cindex DATE columns, problems
  2563. @cindex problems, @code{DATE} columns
  2564. @node Using DATE, Timezone problems, Not enough file handles, Problems
  2565. @section Problems Using @code{DATE} Columns
  2566. The format of a @code{DATE} value is @code{'YYYY-MM-DD'}. According to ANSI
  2567. SQL, no other format is allowed. You should use this format in @code{UPDATE}
  2568. expressions and in the WHERE clause of @code{SELECT} statements.  For
  2569. example:
  2570. @example
  2571. mysql> SELECT * FROM tbl_name WHERE date >= '1997-05-05';
  2572. @end example
  2573. As a convenience, @strong{MySQL} automatically converts a date to a number if
  2574. the date is used in a numeric context (and vice versa). It is also smart
  2575. enough to allow a ``relaxed'' string form when updating and in a @code{WHERE}
  2576. clause that compares a date to a @code{TIMESTAMP}, @code{DATE}, or a
  2577. @code{DATETIME} column.  (Relaxed form means that any punctuation character
  2578. may be used as the separator between parts. For example, @code{'1998-08-15'}
  2579. and @code{'1998#08#15'} are equivalent.) @strong{MySQL} can also convert a
  2580. string containing no separators (such as @code{'19980815'}), provided it
  2581. makes sense as a date.
  2582. The special date @code{'0000-00-00'} can be stored and retrieved as
  2583. @code{'0000-00-00'.} When using a @code{'0000-00-00'} date through
  2584. @strong{MyODBC}, it will automatically be converted to @code{NULL} in
  2585. @strong{MyODBC} Version 2.50.12 and above, because ODBC can't handle this kind of
  2586. date.
  2587. Because @strong{MySQL} performs the conversions described above, the following
  2588. statements work:
  2589. @example
  2590. mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
  2591. mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
  2592. mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
  2593. mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
  2594. mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
  2595. mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
  2596. mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
  2597. mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
  2598. mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505;
  2599. mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';
  2600. @end example
  2601. @noindent
  2602. However, the following will not work:
  2603. @example
  2604. mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'19970505')=0;
  2605. @end example
  2606. @code{STRCMP()} is a string function, so it converts @code{idate} to
  2607. a string and performs a string comparison.  It does not convert
  2608. @code{'19970505'} to a date and perform a date comparison.
  2609. Note that @strong{MySQL} does no checking whether or not the date is
  2610. correct.  If you store an incorrect date, such as @code{'1998-2-31'}, the
  2611. wrong date will be stored. If the date cannot be converted to any reasonable
  2612. value, a @code{0} is stored in the @code{DATE} field.  This is mainly a speed
  2613. issue and we think it is up to the application to check the dates, and not
  2614. the server.
  2615. @cindex timezone problems
  2616. @cindex problems, timezone
  2617. @tindex TZ environment variable
  2618. @tindex Environment variable, TZ
  2619. @node Timezone problems, Case sensitivity, Using DATE, Problems
  2620. @section Time Zone Problems
  2621. If you have a problem with @code{SELECT NOW()} returning values in GMT and
  2622. not your local time, you have to set the @code{TZ} environment variable to
  2623. your current time zone.  This should be done for the environment in which
  2624. the server runs, for example, in @code{safe_mysqld} or @code{mysql.server}.
  2625. @xref{Environment variables}.
  2626. @cindex case sensitivity, in searches
  2627. @cindex searching, and case-sensitivity
  2628. @cindex Chinese
  2629. @cindex Big5 Chinese character encoding
  2630. @node Case sensitivity, Problems with NULL, Timezone problems, Problems
  2631. @section Case Sensitivity in Searches
  2632. By default, @strong{MySQL} searches are case-insensitive (although there are
  2633. some character sets that are never case insensitive, such as @code{czech}).
  2634. That means that if you search with @code{col_name LIKE 'a%'}, you will get all
  2635. column values that start with @code{A} or @code{a}. If you want to make this
  2636. search case-sensitive, use something like @code{INDEX(col_name, "A")=0} to
  2637. check a prefix. Or use @code{STRCMP(col_name, "A") = 0} if the column value
  2638. must be exactly @code{"A"}.
  2639. Simple comparison operations (@code{>=, >, = , < , <=}, sorting and
  2640. grouping) are based on each character's ``sort value''. Characters with
  2641. the same sort value (like E, e and