トップ 一覧 検索 ヘルプ RSS ログイン

MySQLの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
*利用コマンド記録

!!!参考サイト
!mysql-4.1 日本語リファレンスマニュアル
*http://dev.mysql.com/doc/refman/4.1/ja/index.html
!mysql-5.1 日本語リファレンスマニュアル
*http://dev.mysql.com/doc/refman/5.1/ja/index.html

!!トラブル対応
!ぼくとMySQLの3日間戦争(予告編) / GMOメディア エンジニアブログ
*http://tech.gmo-media.jp/post/57388878013/mysql-three-days-war-1

""ある日、突然、MySQLが
""落ちた。

""しかもまたすぐ
""落ちた。

*ぼくとMySQLの3日間戦争(調査編)
*http://tech.gmo-media.jp/post/57389739685/mysql-three-days-war-2

""バックアップ用スレーブなのにmax_connections=3000とかなんだよとか思いつつも、threads_connected=0ってことは外部クエリー起因じゃなさそう。てか大体外部からトラフィック来ないし。バッチにも使ってないから。

""…困った時は、coreだよね!

 # vim ./my.cnf
 ..
 core-file
 ..

 # ulimit -c
 0
 # ulimit -c unlimited
 # ulimit -c
 unlimited

""取り敢えずulimit -c 0でDISKを食い潰されないように出力を止めつつ、

*core ファイル確認
*gdb でスタックトレース
 # gdb /usr/local/mysql4026/libexec/mysqld ./core.26263 
 (gdb) bt
 (gdb) thread apply all bt

*my.cnf に core-file を指定すると、クラッシュ時に core ファイルを生成する。
*core ファイルがたくさん発生してディスクが満杯にならないように
*core ファイルを gdb で解析し、どの関数で異常が発生しているかを確認する。
*異常を発生する関数を使用しないよう、mysql を設定しクラッシュしなくなった。


!!日本語全文検索

!MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について / たたみラボ
*http://www.tatamilab.jp/rnd/archives/000390.html
""FULLTEXTとNgramを駆使した日本語全文検索についてまとめてみました。
""LIKE検索に比べて数倍から数十倍の速度 (語句によっては百倍近い速さ) で実行できるのが大きな特徴です。

!MySQL full-text parser plugin collection
""MySQL 5.1 以降ではプラグイン機構が導入されて、全文検索機能のパーサがプラグインできるようになりました。MySQL full-text parser plugin collection project (mysqlftppc) では現在次のプラグインをメンテナンスしています。
*http://sourceforge.net/apps/mediawiki/mysqlftppc/index.php?title=Home-j


!!!インストール
!!FreeBSDでは
*portsnap 更新済み 2010-01 では mysql-server-4.0.27 4.1.25 5.0.89 5.1.42 から選択
!ports インストール
*FreeBSD ports
 # cd /usr/ports/databases/mysql50-server
 # make install WITH_CHARSET=utf8
*起動設定 /etc/rc.conf
 mysql_enable="YES"
 mysql_dbdir="/var/db/mysql" (必要に応じて)
 mysql_limits="YES" (必要に応じて)
*初期化はディレクトリがない場合に自動で行われる
!ports アンインストール
*pkg_delete mysql-server
*/var/db/mysql 削除


!!RHEL-5
*5.0.77-4.el5_4.1 at 2010-01
!インストール
 yum install mysql-server
!!RHEL-4
*mysql-4.1.22-2.el4 at 2010-01
!インストール
 up2date --install mysql-server


!!!管理
!!データベース管理
!データベース作成
 mysqladmin create <<データベース名>>
!データベース名表示
 mysqlshow
!データベース削除
 mysqladmin drop <<データベース名>>
!DBファイルをテーブル単位で分割する設定
*通常はDBのデータは複数テーブルで1ファイル
*http://dev.mysql.com/doc/refman/5.1/ja/multiple-tablespaces.html
*13.5.3.1. Per-Table テーブルスペースを利用する
""このラインを my.cnf の [mysqld] セクションに追加する事で、複数のテーブルスペースを有効にする事ができます: 
 [mysqld]
 innodb_file_per_table
*設定を有効にした後に作成したテーブルから有効
*既存のテーブルはそのまま。ダンプ・レストアし、ibdata* ファイルを手で削除する必要がある。

*mysql ダンプ取得
 mysqldump -u root -p -opt --all-databases > mysql.YYYYMMDD.dump
*移行対象データベース削除
 mysqladmin -u root -p drop <<データベース名>>
 mysqladmin -u root -p drop zabbix (例)
**drop できない場合は、db停止+対象DBディレクトリ削除+db再開(念のため)
*mysql 停止
*InnoDB データファイル削除
**mysql_dbdir/ibdata1
*mysql 再開
*mysql レストア
 mysql -u root -p < mysql.YYYYMMDD.dump

!mysql の 管理者接続
 shell> mysql -u root -p mysql
 shell> mysql --user=root --password mysql

!!ユーザー管理
!ユーザー一覧表示
 SELECT USER,HOST FROM MYSQL.USER ;
!ユーザー追加
 CREATE USER <<ユーザー>> IDENTIFIED BY PASSWORD '<<パスワード>>' ;
!権限指定
 GRANT ALL ON <<データベース名>>.* to <<ユーザー名>> ;
!ユーザー削除
 DROP USER <<ユーザー>> ;
!ユーザーパスワード変更
 SET PASSFORD FOR 'user1' = PASSWORD('password') ;
!!データベースのメンテナンス

!mysqlcheck ― テーブル メンテナンスと修復プログラム / MySQL 5.1 リファレンスマニュアル
*http://dev.mysql.com/doc/refman/5.1/ja/mysqlcheck.html
*全DBチェック
 shell> mysqlcheck --all-databases
 shell> mysqlcheck -u root -p --all-databases
*全DB最適化
 shell> mysqlcheck --optimize --all-databases
 shell> mysqlcheck -u root -p --optimize --all-databases
*全DB統計情報収集
 shell> mysqlcheck --analyze --all-databases
 shell> mysqlcheck -u root -p --analyze --all-databases

!OPTIMIZE TABLE 構文 / MySQL 5.1 リファレンスマニュアル
*http://dev.mysql.com/doc/refman/5.1/ja/optimize-table.html
""もしテーブルの大部分を削除したり、変数長行で何箇所もテーブルを変更した場合は(VARCHAR、VARBINARY、BLOB、または TEXT カラムを持つテーブル)、OPTIMIZE TABLE を利用しなければいけません。
 mysql> OPTIMIZE TABLE tbl_name [, tbl_name]

!!バックアップ

!全体のバックアップ
 mysqldump -A --opt -u root -p > バックアップファイル

!全体のレストア
*mysql データベースを除くデータベースを削除
 > drop database testdb;
 > drop database test02;
*レストアコマンド
 mysql -u root -p < バックアップファイル

!全体のレストア時のエラー対応
*レストア時エラー
""ERROR 1146(42S02) at line 12: Table 'mysql.time_zone_name' doesn't exist
""ERROR 1146(42S02) at line 12: Table 'mysql.time_zone' doesn't exist
""ERROR 1146(42S02) at line 12: Table 'mysql.time_zone_transistion_type' doesn't exist
""ERROR 1146(42S02) at line 12: Table 'mysql.time_zone_transistion' doesn't exist
*<<原因>> 「mysql」データベースを drop してしまっていた。
==mysqladmin -u root -p drop mysql==<<NG!!!>>
*エラーが発生するSQLコマンドを確認
 less バックアップファイル
*バックアップファイル 12行目
""/*!40103 SET TIME_ZONE='+00:00' */;
*タイムゾーン設定時に mysql データベースに time_zone_ 関連テーブルが必要
*エラーが出るテーブルの create table SQL コマンドを確認
 less バックアップファイル
*必要なテーブルを作成
 mysql -u root -p mysql
**mysql.time_zone
**mysql.time_zone_name
**mysql.time_zone_transition
**mysql.time_zone_transition_type
*4つのテーブルを作成後に
 mysql -u root -p < バックアップファイル
を実行できた。

!!InnoDB ログファイルの拡張
*http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_log_file_size
*パラメータを変更するだけだと、エラーを吐いて起動しない。
*パラメータを変更し、innodb ログファイルを削除して起動すると、自動作成される。
!Red Hat Enterprise Linux 4
*Red Hat Enterprise Linux 4.8 の up2date でインストール、更新した mysql-server-4.1.22-2.el4 で確認
*mysqld 停止
 /sbin/service mysqld stop
*/etc/my.cnf ファイルの編集・追加
 innodb_log_file_size=33554432
 innodb_log_files_in_group=4
*InnoDB ログファイルの削除
 rm /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1
*mysqld 起動
 /sbin/service mysqld start
**InnoDB ログファイルは自動作成される
 # ls -l /var/lib/mysql/ib_logfile*
 -rw-rw----  1 mysql mysql 33554432 1月  4日 19:36 /var/lib/mysql/ib_logfile0
 -rw-rw----  1 mysql mysql 33554432 1月  4日 19:13 /var/lib/mysql/ib_logfile1
 -rw-rw----  1 mysql mysql 33554432 1月  4日 19:26 /var/lib/mysql/ib_logfile2
 -rw-rw----  1 mysql mysql 33554432 1月  4日 19:36 /var/lib/mysql/ib_logfile3
**起動時ログ
 091217 17:28:54  mysqld started
 091217 17:28:54  InnoDB: Log file ./ib_logfile0 did not exist: new to be created
 InnoDB: Setting log file ./ib_logfile0 size to 32 MB
 InnoDB: Database physically writes the file full: wait...
 091217 17:28:54  InnoDB: Log file ./ib_logfile1 did not exist: new to be created
 InnoDB: Setting log file ./ib_logfile1 size to 32 MB
 InnoDB: Database physically writes the file full: wait...
 091217 17:28:54  InnoDB: Log file ./ib_logfile2 did not exist: new to be created
 InnoDB: Setting log file ./ib_logfile2 size to 32 MB
 InnoDB: Database physically writes the file full: wait...
 091217 17:28:55  InnoDB: Log file ./ib_logfile3 did not exist: new to be created
 InnoDB: Setting log file ./ib_logfile3 size to 32 MB
 InnoDB: Database physically writes the file full: wait...

!FreeBSD
*FreeBSD-7-Stable ports インストールした mysql-server-5.0.89 で確認
*mysqld 停止
 /usr/local/etc/rc.d/mysql-server stop
*/var/db/mysql/my.cnf 編集
 innodb_log_file_size=33554432
 innodb_log_files_in_group=4
*InnoDB ログファイルの削除
 rm /var/db/mysql/ib_logfile0 /var/db/mysql/ib_logfile1
*mysqld 起動
 /usr/local/etc/rc.d/mysql-server start

!!デフォルトのDBエンジン指定
*my.cnf
 mysql_table_type=InnoDB
 default_storage_engine=InnoDB
**どちらか
**default_storage_engine 推奨? セッションでの変更は
 SET storage_engine=MYISAM;

!!!ユーザーでの mysql コマンド
!!接続
 mysql --user=<<ユーザー>> --password=<<パスワード>> <<データベース名>>
 mysql -u <<ユーザー>> -p <<データベース名>>
!!テーブル管理

!テーブル一覧表示
 show tables;

!テーブル作成時のDBエンジン指定
*http://dev.mysql.com/doc/refman/5.1/ja/storage-engine-setting.html
 CREATE TABLE <<テーブル名>> (... ) ENGINE=InnoDB;

!デフォルトのストレージエンジン指定変更
 SET storage_engine=MYISAM;
 SET storage_engine=INNODB;

!テーブルのフィールド表示
 SHOW COLUMNS FROM <<テーブル名>>
!テーブルのインデックス表示
 SHOW INDEX FROM <<テーブル名>>

!!view 管理

!view 一覧
 select * from information_schema.views;

!view 設定の確認
 show create view <view名>;
!!パスワード管理
!自分のパスワード変更
 SET PASSWORD = PASSWORD('password');
!ユーザーのパスワード変更
 SET PASSFORD FOR 'user1' = PASSWORD('password');
または
 mysqladmin password

!!文字コード関連
!文字コード確認
*データベース
 show create database <<データベース名>>
*テーブル
 show create table <<テーブル名>>
!データベース文字コード指定
 create database <<データベース名>> default character set <<キャラクタセット名>>
!データベース文字コード変更
 alter database default character set <<キャラクタセット名>>
!テーブル文字コード変更
 ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

!クライアント文字コード状況確認
 mysql> show variables like "%char%";
 +--------------------------+----------------------------+
 | Variable_name            | Value                      |
 +--------------------------+----------------------------+
 | character_set_client     | utf8                       |
 | character_set_connection | utf8                       |
 | character_set_database   | utf8                       |
 | character_set_filesystem | binary                     |
 | character_set_results    | utf8                       |
 | character_set_server     | utf8                       |
 | character_set_system     | utf8                       |
 | character_sets_dir       | /usr/share/mysql/charsets/ |
 +--------------------------+----------------------------+
 8 rows in set (0.00 sec)


!!バックアップ関連
!DB指定バックアップ
 mysqldump <<データベース名>> > <<バックアップファイル>>
!DB指定レストア
 mysqldump <<データベース名>> < <<バックアップファイル>>

!!管理コマンドパスワード指定
*ファイル作成 /path/to/mysql_ini
 [client]
 password=P@$$w0rd
*ファイル権限設定
 shell> chmod 400 /path/to/mysql_ini
*コマンド
 /usr/bin/mysqladmin --defaults-extra-file=/path/to/mysql_ini -u root 

!!クライアント初期設定
 [client]
 password=P@$$w0rd
 default-character-set=utf8
*コマンド
 mysql --defaults-file=another.my.cnf
!!!参考
!!MySQL 5.1 リファレンスマニュアル
*http://dev.mysql.com/doc/refman/5.1/ja/
*日本語版に記述がなくて英語版にある場合が多い。
*英語のリファレンスマニュアルの参照は必須

!MySQL5の既存DB文字コード変更(latin1からujis) / Wingnotes
*http://www.wingnotes.net/linux_server/mysql_latin1_ujis.html
 # mysqldump --default-character-set=binary -u ユーザ名 DB名 --password=パスワード > ダンプの出力ファイルパス

 # sed 's/latin1/utf8/g' ダンプファイル

 # mysql -u ユーザ名 -p DB名 --default-character-set=ujis < ダンプファイル名

 mysql> alter database DB名 character set ujis;

 # vi my.cnf
 [mysqld]
 default-character-set=ujis
 skip-character-set-client-handshake
*??

 # service mysqld start
!!!障害

!!MySQL のデータベース zabbix でテーブル history 破損
!zabbix の history テーブル破損確認
 [root@sysbkup01 zabbix]# time mysqlcheck -u root -p zabbix history
 Enter password:
 zabbix.history
 error    : Corrupt
 
 real    195m47.145s
 user    0m0.006s
 sys     0m0.002s

!repair 実施
 mysql> repair table history;
 +----------------+--------+----------+---------------------------------------------------------+
 | Table          | Op     | Msg_type | Msg_text                                                 |
 +----------------+--------+----------+---------------------------------------------------------+
 | zabbix.history | repair | note     | The storage engine for the table doesn't support repair |
 +----------------+--------+----------+---------------------------------------------------------+
 1 row in set (0.00 sec)
* 修復コマンド 調査中

 mysql> show create table history;
 +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | Table   | Create Table                                                                                                                                                                                                                                         |
 +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 | history | CREATE TABLE `history` (
   `itemid` bigint(20) unsigned NOT NULL default '0',
   `clock` int(11) NOT NULL default '0',
   `value` double(16,4) NOT NULL default '0.0000',
  KEY `history_1` (`itemid`,`clock`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
 +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 1 row in set (0.25 sec)

!mysqld.log
*/var/log/mysqld.log

 120411 15:32:06  InnoDB: error clustered record for sec rec not found
 InnoDB: index `history_1` of table `zabbix/history`
 InnoDB: sec index record PHYSICAL RECORD: n_fields 3; 1-byte offs TRUE; info bits 0
  0: len 8; hex 0000000000004d61; asc       Ma;; 1: len 4; hex ca6280fa; asc  b  ;; 2: len 6; hex 000092cbaf7a; asc      z;;
 
 InnoDB: clust index record PHYSICAL RECORD: n_fields 1; 1-byte offs TRUE; info bits 0
  0: len 8; hex 696e66696d756d00; asc infimum ;;
 
 TRANSACTION 7 351447463, ACTIVE 0 sec, process no 14667, OS thread id 1865653152 starting index read, thread declared inside InnoDB 500
 mysql tables in use 1, locked 1
 3 lock struct(s), heap size 320
 MySQL thread id 13, query id 32248 localhost zabbix updating
 delete from history where itemid=19809 and clock<1247983930
 
 InnoDB: Submit a detailed bug report to http://bugs.mysql.com