#author("2017-04-04T15:47:33+09:00","default:wikiwriter","wikiwriter") #author("2017-06-18T17:26:35+09:00","default:wikiwriter","wikiwriter") &tag(MySQL/管理); *目次 [#c2811613] #contents *参考情報 [#seea8701] -[[MySQL]] *ユーザー操作 [#rf61dc5d] **rootパスワードの設定 [#ee7826fb] -rootのパスワードが設定されていない場合必ず設定しておく。 ***mysqladminコマンドで設定 [#k6ed0609] mysqladminコマンドを使って設定する方法。 mysqladmin -u root password <new_password> ***mysqlコマンドで設定 [#v582321e] mysqlテーブルを操作してパスワードを設定する方法。 #pre{{ $ mysql -u root -p; mysql> use mysql; mysql> set password for root@localhost=password('任意のpasswd'); }} **ユーザー登録 [#faf9e91b] -データベースの作成も可能なユーザーを登録するには、以下のように実行する。 -ON *.*のところの最初がDB名で、二つ目がテーブル名。 #pre{{ $ mysql -u root -p mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード' mysql> GRANT ALL PRIVILEGES ON testdb.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード' }} -ホスト名のところはワイルドカード'%'が指定できる。 mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名@'%' IDENTIFIED BY 'パスワード' -ホスト名の部分を省略しても同じ事になるらしい。 mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名 IDENTIFIED BY 'パスワード' -確認はrootでuserテーブルを見れば良い。 #pre{{ $ mysql -uroot -p mysql> use mysql; mysql> select * from user; }} ***localhostから接続しようとしてもAccess Denied [#d02e1397] -Unix系のマシンでローカルホストから接続するときにホスト名のワイルドカード'%'がきかないことがある。その理由は[[MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.3.12 Access denied エラーの原因:http://dev.mysql.com/doc/refman/4.1/ja/access-denied.html]]にある通りか? #pre{{ Access denied の原因がわからない場合は、user テーブルから Host 値にワイルドカードが含まれているエントリ(‘%’ または ‘_’ を含むエントリ)をすべて削除する。 よくある間違いは、Host='%' および User='some user' の新規エントリを挿入し、これで、同一マシンから接続する際には localhost を指定できると考えていることである。これがうまくいかない理由は、デフォルト権限として、Host='localhost' および User='' のエントリが含まれているためである。Host 値が 'localhost' の場合、'%' よりも具体的なため、localhost からの接続時に新しいエントリよりもデフォルト権限が優先される。正しい指定の方法は、Host='localhost' および User='some_user' の 2 つ目のエントリを挿入するか、Host='localhost' および User='' のエントリを削除することである。 }} -'%'とlocalhost二つを指定してgrantすればとりあえず良いっぽい。[[Allowing wildcard (%) access on MySQL db, getting error "access denied for '<user>'@'localhost'" - Server Fault:http://serverfault.com/questions/122472/allowing-wildcard-access-on-mysql-db-getting-error-access-denied-for-use]]なども参照のこと。 *データベース操作 [#y1bae0cc] **データベースの生成文を表示する [#l161761a] -show create database <データベース名> を使う。DEFAULT CHARACTER SETや、COLLATEを確認できる。 show create database testdb *テーブル操作 [#c88880b1] ** テーブルの生成文を表示する [#x7a007c3] -データベースに接続してコマンド実行 show create table xxxxx; -mysqldumpを使って一気に表示。テーブル名を省略すればデータベース内の全てのテーブルが対象になる。 mysqldump -d <データベース名> (<テーブル名>) ** カラムを追加する [#bf6a9791] -ALTER TABLEでOK。 ALTER TABLE item ADD COLUMN price char(100); ***NOT NULLの列を追加したらどうなるか [#v6afa6ab] -0とか空文字とかで勝手に初期化される。 -[[データが存在するテーブルに not null 制約の付いたカラムが追加できる - ぱんくず:http://d.hatena.ne.jp/pankuzu/20090220/1235121201]]によると、MySQL独特の挙動のようだ。 ** カラムの順番を変更する [#e90893b3] -[[MySQLのカラム順番変更 | 江島@システム開発:http://tech.eshima.info/?p=173]]より、 ALTER TABLE テーブル名 MODIFY カラム名 データ型 after 移動させる一つ上のカラム名; **カラムのタイプを変更する [#b9ceefbd] - ALTER TABLE 〜 CHANGE COLUMN構文で変更できる。このとき既存データはできるだけ維持されるよう変換されるため、varcharのサイズを増やす場合は、データがなくなるといった心配はしなくてよい。 ALTER TABLE book CHANGE COLUMN title title varchar(400); **主キーを複合キーに変更(主キーに列を追加) [#r95ac40f] -[[mysql - ALTER TABLE to add a composite primary key - Stack Overflow:http://stackoverflow.com/questions/8859353/alter-table-to-add-a-composite-primary-key]]より。 -最初に既存の主キーをDROPしてから再作成する。 ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing); *Tips [#xb2f6a35] **データフォルダの場所を確認する [#j1011bb5] -[[database - How to find the mysql data directory from command line in windows - Stack Overflow:http://stackoverflow.com/questions/17968287/how-to-find-the-mysql-data-directory-from-command-line-in-windows]] -以下のコマンドで可能となる。 mysql -uUSER -p -e 'SHOW VARIABLES WHERE Variable_Name LIKE "%dir"' **アクセスするホストを制限したい [#yd88e7a5] -my.cnfなどでは指定できないのでgrantでアクセスできるホストを指定する。 **ssh経由の操作 [#edb68c2b] ***基本 [#ba9681b3] -[[MySQLでエクスポートとインポートを効率よく行う ついでに圧縮 | Hideki's blog:http://blog.deskportal.net/hideki/2012/05/21/mysql%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E5%8A%B9%E7%8E%87%E3%82%88%E3%81%8F%E8%A1%8C%E3%81%86%E3%80%80/?lang=ja]] -[[mysqldump の結果をそのまま圧縮したり転送したりするコマンド例 | バシャログ。:http://c-brains.jp/blog/wsg/10/09/30-183733.php]] mysqldump -udb_user db_name -pdb_pass | gzip | ssh example.com 'zcat | mysql -udb_user db_name -pdb_pass' ***"-e"コマンドでSQLを実行する場合の注意点 [#d2104aa8] -"*"などがシェルに解釈されないように注意 -シェルから実行する場合 ssh dbserver "mysql demodb_production -e 'select * from books'" -Rubyから呼び出す場合*をエスケープする必要がある(?)。 "ssh dbserver \"mysql demodb_production -e 'select \* from books'\" " **バイナリログの削除 [#o0330281] -使用している内にmysql-bin.000999というようなファイルが大量にたまってくる。 -バイナリファイルと呼ばれ、デフォルトでは自動的に削除されない。 -手動で全削除する場合、以下のコマンドを実行する。 #pre{{ mysql> RESET MASTER; mysql> show binary logs; }} *チューニング [#x1e4082e] **遅いクエリを特定したい [#u19c25f3] -slow log query機能を使用する。 -my.cnfに以下を追加。mysqldを再起動する。/var/logに出力する場合slow_query.logのパーミッションに要注意(mysqld.logを確認して書き出しに失敗している場合chown -R mysql.mysqlとする)。 #pre{{ [mysqld] slow_query_log=1 slow_query_log_file=/var/log/slow_query.log long_query_time=1 }} -mysqldumpslowで解析。[[Mysql slow queryの設定と解析方法 - masayuki14’s diary:http://masayuki14.hatenablog.com/entry/20120704/1341360260]] mysqldumpslow -s t /var/log/mysql/mysql-slow.sql