SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{your_db}';
SELECT database_name, table_name, index_name, ROUND(stat_value * @@innodb_page_size / 1024 / 1024, 2) size_in_mb FROM mysql.innodb_index_stats WHERE stat_name = 'size' AND index_name != 'PRIMARY' ORDER BY size_in_mb DESC;
mysqldump を行うユーザが必要な権限は以下の通り。
GRANT FILE ON *. * TO 'user'@192.168.0.200';
GRANT SELECT , LOCK TABLES , SHOW VIEW ON `db_name` . * TO 'user'@192.168.0.200';
もしダンプにプロシージャも含めたい場合のみ。
GRANT SELECT ON mysql.proc TO 'user'@192.168.0.200';
新年の大掃除という事でサーバのログアラートを眺めていたら、
mysql から innoDB 関連の以下のようなエラーがみつかったので修正する事に。
100101 2:50:34 InnoDB: ERROR: the age of the last checkpoint is 9433664, InnoDB: which exceeds the log group capacity 9433498. InnoDB: If you are using big BLOB or TEXT rows, you must set the InnoDB: combined size of log files at least 10 times bigger than the InnoDB: largest such row.
エラー発生時間から大体何が起きたのか把握できたので、 innodb_log_file_size を増やす事に。
いつものように My.cnf を修正して再起動すれば良いだろうと思ってやったら、以下のようなエラーが。
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes InnoDB: than specified in the .cnf file 0 33554432 bytes!
どうやら、少し違ったらしい。
この二つ、用途はほとんど同じで、「レコードが存在していれば更新、なければ追加」っていうことなんだけど、
実は更新を行う処理は少し違う。
REPLACE INTO は名のごとくレコードを置き換える。
プライマリキーを検索ユニーク条件として更新処理を行う際には素直に UPDATE すしてくれるが、
プライマリキー以外のユニークキーを条件にして更新する場合は、 DELETE して INSERT する。そのためプライマリキーをオートインクリメントなどにしてあると、新しい ID が振られてしまいえらいことになる。
これに対して INSERT ON DUPLICATE KEY UPDATE は素直に UPDATE のみを行うの。
用途に合わせて使い分ければどちらも便利。ただ、どちらも MySQL の拡張機能です。
この前 MySQL をパッケージでインストールしたら、 Mac 起動時に mysqld が勝手に起動する。これを起動しないようにするには、 /etc/hostconfig を修正すれば良い。
$ sudo vi /etc/hostconfig
AFPSERVER=-NO- AUTHSERVER=-NO- AUTOMOUNT=-YES- NFSLOCKS=-AUTOMATIC- NISDOMAIN=-NO- TIMESYNC=-YES- QTSSERVER=-NO- WEBSERVER=-NO- SMBSERVER=-NO- SNMPSERVER=-NO- MYSQLCOM=-NO-
ちなみにスタートアップスクリプトの場所は、
/Library/StartupItems/MySQLCOM/MySQLCOM
/usr/local/mysql/support-files/mysql.server
なので、これを使って起動したいときは、
$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
$ sudo /usr/local/mysql/support-files/mysql.server start
MySQL は CSV をインポートしたりエクスポートしたりできる。またバージョン 5.0 からはそのままデータテーブルとして扱ったりすることができるらしいんだけど、 CentOS-4.4 の MySQL5 では configured されてないっぽい。その内されたら試す。
SELECT * FROM table_name INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',';
LOAD DATA INFILE 'data.txt' INTO TABLE table_name FIELDS TERMINATED BY ',';
INTO の前に REPLACE とか IGNORE とかをつけると、重複キーが見つかった場合のアクションを指定できる。
古いバージョンの php から新しいバージョンの mysql にアクセスした際に、こんなエラーをくらうことがある。
Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in *.php on line * couldn't connect: Client does not support authentication protocol requested by server; consider upgrading MySQL client
MySQL のパスワード認証方法が 4.0 から 4.1 でちょっと変わった事が原因。
サーバ側で php が新しくなるまで old password を使うように設定してやればいい。
# vi /etc/my.cnf
... [mysqld] old_passwords=1 ...
もしくは、 mysql のユーザのパスワードを古い形式に変更してやる。
$ mysql mysql> SET PASSWORD FOR user_name = OLD_PASSWORD('user_password');
.Net から MySQL に接続するには MySQL AB がリリースしている MySQL Connector/Net を使用します。
MySQL® Connector/Net
MySQL はフリーでかなり優れているので、 .Net からの使用用途もかなり増えました。
とりあえず Visual Studio 2003 で C# ASP .NET から MySQL に接続しました。
Coldfusion 7 の管理画面からデータソースへいって、データソースの設定をしようとしても、 MySQL 5 用のドライバは標準では用意されてない。
でも MySQL からしっかりと配布されているのでそれを入手して設定すれば普通に使えます。
そのときのメモ。