MySQLの運用

プロンプトの変更

MySQLのプロンプトにユーザ名,ホスト名やデータベース名を表示する

mysql> prompt (\u@\h)[\d]\_>

実行例

mysql> prompt (\u@\h)[\d]\_>
PROMPT set to '(\u@\h)[\d]\_>'
(root@localhost)[(none)] >
(root@localhost)[(none)] >use mysql;
Database changed
(root@localhost)[mysql] >

ずっと変更する場合は、my.cnfに設定

# vi /etc/my.cnf
[mysql]
prompt=(\\u@\\h)[\\d]\\_>

パスワードの変更

mysql> SET PASSWORD FOR root@localhost = PASSWORD('root1234');
Query OK, 0 rows affected (0.00 sec)
mysql>

ファイルへの出力

mysql> tee ファイル名

ファイルへの出力をやめるには

mysql> notee

innnodbのデータファイルの分割

その1
[mysqld]
innodb_data_home_dir =
innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M

その2
[mysqld]
innodb_data_home_dir = /ibdata
innodb_data_file_path=ibdata1:50M;ibdata2:100M:autoextend

その3
[mysqld]
innodb_data_home_dir =
innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend

InnoDBは、OSの最大ファイルサイズを考慮しないので
ファイルシステム側で2GBの制限がある場合は注意が必要

スロークエリーログの出力

3秒以上かかるクエリーを/var/log/slow.logに出力(デフォルトは10秒)

# vi /etc/my.cnf
log-slow-queries = /var/log/slow.log
long-query-time = 3

設定変更後にMySQLの再起動が必要

MySQLのエラー調査方法

MySQLは、内部エラーメッセージ(errno:**)やシステムエラーコード(Errcode:**)を
出力するので、perrorコマンドで意味の調査が可能

# perror 1 100
OS error code   1:  Operation not permitted
OS error code 100:  Network is down
#

レプリケーション異常時にクエリーを1行スキップしたい場合

mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTRER=1</i>
mysql> START SLAVE;

断片化の対処

データファイルの断片化を解消するにはOPTIMIZE TABLEを実行する

mysql> OPTIMIZE TABLE テーブル名;
  • MyISAMの場合
    • ファイルのリサイズ可能
  • InnoDBの場合
    • ファイルのリサイズ不可
    • テーブルをDROPし再構築するか、innodb_file_per_tableを使用してファイルごとに実行する

myisam-recoverオプション

myisam-recover=BACKUP,FORCEオプションを設定しmysqlを起動すると
アクセスしたテーブルに異常があった場合、テーブルを自動的に修復する

[Error] mysqld: Table 'テーブル名' is marked as crashed and should be repaired
[Warning] Checking table: 'テーブル名'

自動修復で回復されないテーブルがあった場合、以下のエラーメッセージが出力される

Error: Couldn't repair table: テーブル名

または

Retrying repair of : テーブル名 failed.
Please try REPAIRE EXTENDED or myisamchk

BACKUPを指定している場合、修復の際にデータファイル(MYD)のバックアップ(BAK)が取られる

強制修復の結果、少ない行しか救えなかった場合は、以下のようなメッセージが出力される

Warning: Found 222 of 233 rows when repairing テーブル名

自動修復で回復されないテーブルがあった場合、REPAIRテーブルを実行する

mysql> REPAIR [LOCAL] TABLE テーブル名 オプション