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;
.tables コマンドで見れます。
$ sqlite3 test.sqlite SQLite version 3.7.2 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables sql_master test_table
dbname=# SELECT * FROM pg_database;
*in MySQL
show databases;
dbname=# \d
*in MySQL
show tables;
dbname=# \c {db_name}
*in MySQL
use {db_name};
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!
どうやら、少し違ったらしい。
うちのレンタルサーバのスペックが低いため MySQL 動かしたくないので、 Wordpress を SQLite で動かすようにしてみた。
してみたと言っても、プラグインがあるのでそれを入れるだけ。でもそもそも個人や一企業で使うブログを MySQL なんてもので動かすのもナンセンスな話だし、 SQLite は早い。なので、一応メモ。
この二つ、用途はほとんど同じで、「レコードが存在していれば更新、なければ追加」っていうことなんだけど、
実は更新を行う処理は少し違う。
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
このブログでは SQLite を使ってるんだけど、先ほどサーバ以降後に始めてブログを更新しようとしたら、表題のエラーが出てできない。データファイルのパーミッションを確認しても 777 だし、そもそも読み込みはできてる。
調べてみると SQLite は更新時に dbfilename-journal というファイルを一時的に作成するらしく、ディレクトリの書き込み権限がないと更新できないらしい。
もう少し親切なエラーメッセージならなー、と思った。
PHP の is_null() だとなんだのやったついでに SQL の NULL 比較についても書いておく。
よく論理削除を制御するためのカラムを作って、 0 か 1 で削除されてるかの判断したりするけど、初期値で NULL がセットされちゃったりして deleted = 0 も deleted = 1 とかやっても条件がマッチしなかったりする。
これは NULL を判別するには deleted IS NULL か deleted IS NOT NULL にしないと駄目だから。
でもじゃあ
deleted = 0 OR deleted IS NULL
とかはちょっとかっこ悪いので、 IFNULL() 関数なんかを使って
IFNULL(deleted,0) = 0
とやると、中々見た目がいい。
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 とかをつけると、重複キーが見つかった場合のアクションを指定できる。
SQLServer のフリー版が MSDE だった頃に色々と osql コマンドを使ったので、それのメモ。今は Express とか GUI 付きでフリーなのでいいね。
でもいざって時に役立つと思います。というか知っておいても損は無い。
古いバージョンの 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');
新たにレコード INSERT 時に、シーケンスキーの次の値を特定の項目にセットする場合は以下のように行う。
INSERT INTO TBL_NAME VALUES (nextval ('seq_name'), 1, 2);
また、その結果インクリメントされたシーケンスキーの値を参照するには
SELECT currval ('seq_name');
さらに、シーケンスキーの値を設定しなおしたい場合は、
SELECT setval ('seq_name', 10);SELECT setval ('seq_name', 10, false);
となり、前者は nextval の結果が 11 となり、後者は 10 となる。
たまに Access で作成したマクロやフォームから特定の文字列を検索したいときなどがあり困るんですが、
実は Access のマクロやフォームはテキストファイルに変換できます。
しかも簡単な VB スクリプトを書くだけ。
そのやり方のメモ。
.Net から MySQL に接続するには MySQL AB がリリースしている MySQL Connector/Net を使用します。
MySQL® Connector/Net
MySQL はフリーでかなり優れているので、 .Net からの使用用途もかなり増えました。
とりあえず Visual Studio 2003 で C# ASP .NET から MySQL に接続しました。
Coldfusion 7 の管理画面からデータソースへいって、データソースの設定をしようとしても、 MySQL 5 用のドライバは標準では用意されてない。
でも MySQL からしっかりと配布されているのでそれを入手して設定すれば普通に使えます。
そのときのメモ。
SQLServer で CSV 形式のデータファイルを import/export するには、 bcp コマンドを使用すると便利です。フォーマットファイルというのを指定することで、型の定義も可能で非常に便利。
またインポートは、 osql で BULK INSERT クエリを発行することでも対応できます。
SQLServer でデータを backup/restore するには osql で BACKUP/RESTORE クエリを発行することで行えます。
作成するダンプファイルにパスワードをつけることも可能です。
SQLServer で文字列検索を実行した際にアルファベットの大文字小文字やひらがなカタカナを区別しなかったりした時には、照合順序(Collation)が正しくない場合がある。
一通りの照合順序の設定方法と意味などをまとめておく。