follow us in feedly

MySQL

MySQLのSETで単位指定したらエラーになるって知った

MySQLでバイナリログの最大サイズ設定を変更することがありました。
そのときに知ったSETでの設定方法について、備忘のためにも紹介します。

SETでの設定に単位を使用したらエラーになった

MySQLを再起動せずにmax_binlog_sizeを変更したかったので、SETを使って設定しようとしたらエラーになってしまいました。
エラーの原因は設定値に単位を使っていたからでした。

mysql> SET GLOBAL max_binlog_size = 512M;
ERROR 1232 (42000): Incorrect argument type to variable 'max_binlog_size'

なので、下記のように数値のみにしたところ問題なく実行されました。

mysql> SET GLOBAL max_binlog_size = 536870912;
Query OK, 0 rows affected (0.00 sec)

SETでは単位指定は使用できない

はじめはMySQLのバージョンが古いからかと思いましたが、SETでは単位(サフィックス)は使用できないとのこと。
下記、MySQL 5.6のマニュアルより引用します。

値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に SET で値を設定するためには使用できません。一方、SET を使用すると、式を使用して変数の値を割り当てることができますが、サーバーの起動時に変数を設定するときには使用できません。たとえば、サーバーの起動時に次の 1 行目は有効ですが 2 行目は無効です。

shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024

逆に、実行時に次の 2 行目は有効ですが 1 行目は無効です。

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

まとめ

MySQLでSETを使った設定における値の指定方法についてご紹介しました。
SETを使う場合は、単位指定が不可であることを初めて知りました。

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.5 システム変数の使用

MacのMySQLでrootパスワードを再設定する方法

今回はMacのMySQLでもrootパスワードを再設定することになりました。
前回のときにメモしといたから簡単にできるかなと思ったのですが、
あまり関係ないところでちょっとハマりました。

ちなみに、MacのMySQLはHomebrewを使ってインストールしています。
MySQLのバージョンは5.5です。

my.cnfを設定する

my.cnfに「skip-grant-tables」を追加します。
まずは、デフォルトの設定ファイルをコピーします。
自分用の環境だからどれでもいいかな、ということでmy-large.cnfにしています。

$ cp /usr/local/Cellar/mysql/5.5.19/support-files/my-large.cnf /usr/local/var/mysql/my.cnf

設定ファイルについては下記が参考になります。
my.cnfのデフォルト設定ファイル – Liquidfuncの日記

/usr/local/var/mysql/my.cnfに「skip-grant-tables」を追加します。

[mysqld]

skip-grant-tables

MySQLを再起動します。
自動起動がONなっている場合は「mysql.server stop」だけでいけます。
自動起動をOFFにする方法は下記補足を参照してください。

$ mysql.server stop
$ mysql.server start

新しいrootパスワードを設定する

MySQLサーバに接続して、新しいrootパスワードを設定します。

$ mysql -u root mysql
Enter password:

mysql> UPDATE user SET Password=PASSWORD('mynewpassword') WHERE User='root';
mysql> FLUSH PRIVILEGES;

/usr/local/var/mysql/my.cnfに記述した「skip-grant-tables」を削除して、
MySQLを再起動します。

$ mysql.server stop
$ mysql.server start

MySQLに接続できるか確認して完了です。

$ mysql -u root -p
Enter password:

補足: MySQLの自動起動をOFFにする

MySQLの自動起動はデフォルトではONになっているので自動起動をしない設定します。
自動機能の設定は起動スクリプトに記述します。
~/Library/LaunchAgents/homebrew.mxcl.mysql.plistの「KeepAlive」を「false」に変更します。

変更前:
<key>KeepAlive</key>
<true/>

変更後:
<key>KeepAlive</key>
<false/>

launchctlコマンドを実行してスクリプトを再読み込みすれば、自動起動がOFFになります。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

tmuxで lanchctl load を実行するとエラーになる

launchctlコマンドを実行しするところでエラーが出ました。
Bugとか言ってる。

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Bug: launchctl.c:2425 (25957):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1
launchctl: Error unloading: homebrew.mxcl.mysql

loadでやってみても同じ。

$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Bug: launchctl.c:2425 (25957):13: (dbfd = open(g_job_overrides_db_path, O_RDONLY | O_EXLOCK | O_CREAT, S_IRUSR | S_IWUSR)) != -1
launch_msg(): Socket is not connected

調べてみると下記を見つけました。
Mac OS Xのtmux内でlaunchctl load -w したらBug: launchctl.c:2406 (25182):13:って怒られるよねって話: 麦汁三昧

tmuxを使っていると上手く動かないみたいです。
tmuxの外で実行したらできました。

MySQLで一般クエリログを取得する方法

MySQLで一般クエリログを出力する方法のメモ。
一般クエリログはMySQLへの接続や切断、SQLなどを記録します。
設定方法は、オプションをつけて起動する方法とシステム変数で設定する方法があります。

Railsなどのフレームワークではログを取れますが、
フレームワークは使わないとかMySQLでログを取りたいとかあるかもしれない。

MySQLの起動スクリプトにログのオプションを設定する

/etc/rc.d/init.d/mysqldを編集します。
起動時に –log というオプションを使用するようにします。
クエリログの出力先を指定することもできます。
MySQLを再起動するとクエリログが有効になります。

$exec --datadir="$datadir" --socket="$socketfile"
      --log=/var/log/mysql/mysql.log --pid-file="$mypidfile"
      --basedir=/usr --user=mysql >/dev/null 2>&1 &

グローバルシステム変数でクエリログを設定する

MySQLサーバに接続して、下記を実行すればクエリログが有効になります。
この方法であれば、MySQLを再起動する必要はないです。
MySQL 5.1.12以降でしかできません。

mysql> use mysql;
mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/log/mysql/mysql.log';

general_logでクエリログの有効化/無効化を指定します。
general_log_fileでクエリログの出力先を指定します。

以上です。

MySQLのrootパスワードを再設定する方法

MySQLのrootパスワードを忘れてしまって再設定しました。
以前にも同じことをしてるので、次から調べずにすむようにメモしておく。
MySQLのバージョンは5.1です。

MySQLを停止する。

# /etc/init.d/mysqld stop

/etc/my.cnfに「skip-grant-tables」を追加する。

[mysqld]

skip-grant-tables

MySQLを起動する。

# /etc/init.d/mysqld start

MySQLサーバに接続して、新しいrootパスワードを設定する。

# mysql -u root mysql
Enter password:

mysql> UPDATE user SET Password=PASSWORD('mynewpassword') WHERE User='root';
mysql> FLUSH PRIVILEGES;

MySQLを停止する。

# /etc/init.d/mysqld stop

/etc/my.cnfに記述した「skip-grant-tables」を削除して、MySQLを起動する。

# /etc/init.d/mysqld start

MySQLに接続できるか確認して完了。

# mysql -u root -p
Enter password:

パスワードを忘れるとめんどうですね。

rake db:createコマンドのデータベース作成時の動作について

前回の記事では下記の手順でデータベースを作成していました。
1. MySQLでユーザを作成
2. config/database.ymlに設定を記述
3. rake db:createコマンドを実行

ですが、ユーザを作成していなくてもrakeコマンドはデータベースを作成します。
ユーザが存在しない場合、rakeコマンドはデータベース作成時にユーザも作成するわけです。

ためしにやってみます。
前回の「MySQLユーザの作成」をとばして、config/database.ymlに設定を追加します。

development:
  …
  username: testuser
  password: testpass
  …
test:
  …
  username: testuser
  password: testpass
  …

rake db:createコマンドを実行すると、下記のようにMySQLのrootパスワードを聞いてきます。

$ rake db:create
Access denied for user 'testuser'@'localhost' (using password: YES).
Please provide the root password for your mysql installation
>

MySQLのrootパスワードを入力するとデータベースが作成されます。
このときにユーザを作成して、データベースへの権限も付けています。

データベース作成時のクエリを出してみました。
WITH GRANT OPTIONは他のユーザに自分と同じ権限を与えられるみたいです。
ここでは、rails_app_development のすべての権限かな。

CREATE DATABASE `rails_app_development` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
GRANT ALL PRIVILEGES ON rails_app_development.* TO 'testuser'@'localhost' IDENTIFIED BY 'testpass' WITH GRANT OPTION

ただし、MySQLのユーザが存在していてもrootパスワードを聞かれることがあります。
config/database.ymlに記述したパスワードが間違っている場合です。
この場合もrootパスワードを入力するとデータベースが作成されますが、このときにMySQLのユーザのパスワードが間違ったものに書き換わってしまうので注意してください。

意図せずrootパスワードを聞かれた場合は、中断(Ctrl-C)して設定を確認したほうがよさそうです。

Rails 3.2とMySQLでアプリケーションを作成する

前回の記事(1ヶ月以上も前…)で Rails 3.2 の開発環境を構築しました。
ここから、少しずつでもいいのでアプリケーションを作っていきたいですね。
とりあえず、Rails と MySQL でアプリケーションの基礎構築までやってみました。
途中までは前回と同じような内容です。

サーバ環境や Rails 環境の構築は下記あたりを参考にしてください。
さくらVPS に nginx + WordPress の環境を構築する(1) – SSH の設定 | 77 Dogs Blog
さくらVPSに Rails 3.2 の開発環境を構築する | 77 Dogs Blog

Rails アプリを作成する

Rails アプリを作成して、アプリのディレクトリに移動します。
MySQLを使うためのオプションをつけて作成します
–skip-bundle オプションをつけると「bundle install」が実行されなくなります。

$ rails new rails_app -d mysql --skip-bundle
$ cd rails_app

作成されたディレクトリに移動して、Gemfile に下記を追加します。
下記を追加しないと Rails コンソールの起動やデータベース作成時に Javascript ランタイムエラーが出ます。

gem 'execjs'
gem 'therubyracer'

bundle install を実行して gem をインストールします。
-–path オプションでインストール先を指定できます。パスの指定は初回だけで大丈夫です。

$ bundle install --path vender/bundle

MySQL ユーザを作成する

MySQL のユーザを作成し、データベースを操作するための権限を設定します。

$ mysql -u root -p
Enter password:

mysql> CREATE USER 'testuser'@'localhot' IDENTIFIED BY 'testpass';
mysql> GRANT ALL ON rails_app_development.* TO 'testuser'@'localhost';
mysql> GRANT ALL ON rails_app_test.* TO 'testuser'@'localhost';

データベースを作成する

アプリで使用するデータベースを作成します。
まずは、config/database.yml に下記を追加します。

development:
  …
  username: testuser
  password: testpass
  …
test:
  …
  username: testuser
  password: testpass
  …

下記コマンドを実行して、データベースを作成します。
config/database.yml に定義した development と test のデータベースが作成されます。

$ rake db:create

以上で、Rails と MySQL を使ったアプリケーションが作成できました。

補足1: production のデータベースを作成する

production のデータベースを作成する場合は、config/database.yml の production: 以下を編集します。

production:
  …
  username: testuser
  password: testpass
  …

RAILS_ENV=production オプションをつけて、コマンドを実行します。
production のデータベースのみ作成されます。

$ rake db:create RAILS_ENV=production

また、 下記コマンドを実行すると config/database.yml で設定したデータベースがすべて作成されます。

$ rake db:create:all

補足2: データベースを削除する

データベースを削除するには、下記コマンドを実行します。
オプションや all の意味は、rake db:create と同じです。

$ rake db:drop
$ rake db:drop RAILS_ENV=production
$ rake db:drop:all

MacでWordPressのローカル環境を構築する

Mac で WordPress のローカル環境を構築します。
WordPress のテーマやプラグインなどカスタマイズするとして、最初からサーバ上で作るわけにもいかないしローカルであれば手軽に試すこともできるので。
MAMP ならインストールして完了なんですが、ちょっと面倒なことになったこともあるので個別に準備します。
Homebrew もインストールしたことだし。

Webサーバ を起動する

Mac には標準で Apache がインストールされているので起動するだけで使えるようになります。
[システム環境設定] – [共有] にある [Web 共有] にチェックを入れれば完了です。
ブラウザを立ち上げて、下記にアクセスするとページが表示されます。
http://localhost/~username

Homebrew で PHP をインストールする

Homebrew で PHP をインストールします。
Mac には PHP も標準で入っているようですがインストールします。
まず、Formula を落として Homebrew のディレクトリに移動します。

$ curl -O https://raw.github.com/ampt/homebrew/php/Library/Formula/php.rb
$ mv php.rb `brew --prefix`/Library/Formula

brew コマンドを実行してインストールします。オプションは Apache と MySQL を指定します。
MySQL が入っていない場合はインストールされます。

$ brew install php --with-mysql --with-apache

インストールが完了したら、パスをとおすため .bash_profile に下記を追加します。

export PATH="`brew --prefix`/bin:$PATH"

確認して、下記のようになれば OK です。

$ which php
/usr/local/bin/php

Apache の設定をします。/etc/apache2/d.conf に下記を追加します。

#LoadModule php5_module libexec/apache2/libphp5.so ← こちらは標準でインストールされているほうの設定
LoadModule php5_module /usr/local/Cellar/php/5.3.10/libexec/apache2/libphp5.so

Homebrew で MySQL をインストールする

Homebrew で MySQL をインストールします。
brew コマンドを実行してインストールします。
PHP のときにインストールされてると思うが念のために書いておく。

$ brew install mysql

インストール時にメッセージが表示されるので、それに従って設定します。
現在のユーザアカウントでデータベースをセットアップします。

$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

MySQL を起動します。

$ mysql.server start

ログイン時に自動起動するように設定します。

$ mkdir -p ~/Library/LaunchAgents
$ cp /usr/local/Cellar/mysql/5.5.19/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/

MySQL の root パスワードを設定します。

$ /usr/local/Cellar/mysql/5.5.19/bin/mysqladmin -u root password 'password'

MySQL サーバに root で接続する。

$ mysql -u root -p
Enter password: password

MySQL に WordPress 用のデータベースを作成する

MySQLサーバに接続して、データベースを作成します。

mysql> CREATE DATABASE wordpress DEFAULT charset utf8;

データベースのユーザを作成します。

mysql> GRANT ALL ON wordpress.* TO wpuser@localhost IDENTIFIED BY 'password'

WordPress をインストールする

WordPress をダウンロードして、/Users/username/Sites に展開します。
Finder だと [Macintosh HD] → [ユーザ] → [username] → [サイト] です。

$ cd /Users/username/Sites
$ curl -O https://ja.wordpress.org/latest-ja.zip
$ unzip latest-ja.zip

wp-config.php を作成して、WordPress の設定をします。

$ cp wp-config-sample.php wp-config.php
$ vi wp-config.php

下記の部分を修正します。FS_METHOD は追加します。

define('DB_NAME', 'wordpress');
define('DB_USER', 'wpuser');
define('DB_PASSWORD', 'password');
define('FS_METHOD', 'direct');

ブラウザから http://localhost/~username/wordpress/wp-admin/ にアクセスして設定を行えば、ローカル環境で WordPress が使えます。

さくらVPSにnginx + WordPressの環境を構築する(3) – PHPとMySQL のインストール

さくらVPSにPHPとMySQLをインストールします。
主に下記のサイトを参考にさせていただきました。
ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)– さくらインターネット創業日記
さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き)| さくらたんどっとびーず

パッケージをアップデートする

まずは、インストールされているものを最新版にアップデートしておきます。

# yum update

yumのリポジトリを追加する

EPELをダウンロードして追加します。(EPELはインストール済みだったので必要なかった。)

# wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-5.noarch.rpm
# rpm -Uvh epel-release-6-5.noarch.rpm

remiをダウンロードして追加します。

# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# rpm -Uvh remi-release-6.rpm

RPMForgeをダウンロードして追加します。

# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
# rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

リポジトリの設定を行います。
yumコマンドで指定しない限り追加したリポジトリを使用しないようにします。
下記の enableの値を1から0に変更してリポジトリを無効にします。

# vi /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=0 ← 1を0に変更する
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

下記の enable の値を 1 から 0 に変更してリポジトリを無効にします。

# vi /etc/yum.repos.d/rpmforge.repo

[rpmforge]
name = RHEL $releasever - RPMforge.net - dag
baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge
mirrorlist = http://apt.sw.be/redhat/el6/en/mirrors-rpmforge
#mirrorlist = file:///etc/yum.repos.d/mirrors-rpmforge
enabled = 0 ← 1を0に変更する
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 1

MySQLをインストールする

下記を実行して、mysqlをインストールします。

# yum install mysql mysql-server

インストールが完了したら、MySQLサーバを起動します。
また、再起動した時に MySQLサーバが起動するように設定します。

# /etc/init.d/mysqld start
# /sbin/chkconfig --level 345 mysqld on

PHPをインストールする

下記を実行して、PHPをインストールします。

# yum install php php-cli php-xml php-mysql php-mbstring php-devel php-pdo php-pear

eAcceleratorをインストールする

ソースコードをダウンロードして、解凍します。

# wget http://sourceforge.net/projects/eaccelerator/files/latest/download/eaccelerator-0.9.6.1.zip
# unzip eaccelerator-0.9.6.1.zip

ビルドして、インストールします。

# cd eaccelerator-0.9.6.1
# phpize
# ./configure --enable-eaccelerator
# make
# make install

/etc/php.iniにeaccelerator.soを追記します。

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

extension=eaccelerator.so

eaccelerator.cache_dirを/var/tmp/eacceleratorに変更します。
デフォルトの設定(/tmp/eaccelarator)でも問題ないです。
変更する場合は、php.iniの末尾に設定を追記します。

[eAccelerator]
eaccelerator.cache_dir = "/var/tmp/eaccelerator"

ディレクトリを作成して、パーミッションを設定します。

# mkdir -p /var/tmp/eaccelerator
# chmod 777 /var/tmp/eaccelerator

これで、PHPとMySQLのインストールは完了です。