Sunday, March 10, 2013

MySQL:データベースのリストア


mysqldumpで取っておいたデータ(backupfile.sql)をデータベースにリストアしました。
データベースの一部をリストアなので、まずデータベースを作ってその後リストアします。

$mysql -u kinoko -p
Enter password:

mysql> create database kinokoDB;
Query OK, 1 row affected
mysql> exit;


$mysqldump -u kinoko -p KDB < backupfile.sql

失敗するので調べてみるとリストアはmysqldumpではなくmysqlを使うとのこと。

$mysql -u kinoko -p KDB < backupfile.sql

でリストアは成功。

日本語が化けているような気がするので文字コードセットを確認すると、

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)


#characer_set_clientはクライアントが送信する文字コード。
#character_set_resultsはサーバが送信する文字コード。


character_set_serverがlatin1なのでutf8に変更します。が、my.cnfに変更を加えて再起動したものの起動せず。。

$vi /etc/my.cnf
[client]
default-character-set = utf8

[mysqld]
default-character-set = utf8
default-set-server = utf8

$ mysqld_safe --user=root &

エラーログを見てみると、

$less /var/log/mysql/XXXX.err
130310 18:32:11 [ERROR] /usr/sbin/mysqld: unknown variable 'default-character-set=utf8'
130310 18:32:11 [ERROR] Aborting

※mysqld_safeの起動時にも、my.cnfにもエラーログファイル名を指定していないため、XXXXはマシン名になってます。


unknown variable?
調べるとdefault-character-setはMySQL5.5からは使えないらしく、代わりに、character-set-serverを使うとのこと。

$vi /etc/my.cnf
[mysqld]
character-ser-server=utf8

書き替えたら無事に起動したので文字コードを確認すると、

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)
  
全部utf8になりました。

cygwinコンソールの色変更


あまりにコンソールが見づらいので色を変更しました。

リポジトリの保存ディレクトリを作成してgitからダウンロード。

$mkdir ~/git/
$git clone https://github.com/mavnn/mintty-colors-solarized.git

このsol.lightを.bashrcで読むようにする(全部残しているけどsol.lightだけあればOK)

$cd mintty-colors-solarized
$echo mintty-colors-solarized/sol.light >>txt
echo "source ~/$(cat txt) " >> ~/.bashrc

.bashrcを読み直して適用
$source ~/.bashrc

MySQL:インストール後のユーザー作成

散々はまりましたが、順を追って整理するとこの手続きになりました。


ユーザー作成

mysqld_safeを起動した後、ユーザーを作ります。
ユーザー名:test、パスワードabcにします。

$mysql -u root
mysql> grant all privileges on *.* to test@localhost identified by 'abc'


このユーザーを使ってmysqlを使うときは、

$mysql -u test -pabc

または

$mysql -u test -p
Enter password:

でパスワード入力します。

ちなみに-pとabcの間にスペースが入るとabcはdatabaseと見なされます。

$ mysql -u test -p abc
Enter password:
ERROR 1049 (42000): Unknown database 'abc'


また、grant で権限を与える時、ユーザー名がtestだからと
mysql> grant all privileges on *.* to test identified by 'abc'

のように@localhostを書かずに済ますと、
$ mysql -u test -pabc
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)

というエラーが出ます。


rootのパスワード設定

rootのパスワードの設定方法は2つあって、

$mysqladmin -u root password PASSWORD

もしくは、mysqlのプロンプトで

mysql>set password for root@localhost=PASSWORD('パスワード');

です。


とてもわかりやすくて助かりました。


ユーザーの削除


ユーザーはmysqlデータベースのuserテーブルで管理されているので、削除する時は

mysql> use mysql;
mysql> delete from user where user='test'

のように普通に行を削除します。




MySQL:Cygwinにインストール

CygwinでMySQLを使えるよう、インストールしました。いろいろ試して、結局不成功でした。できました。(TRY1の追記)

バージョンは、

$ mysqld --version
mysqld  Ver 5.5.28-log for CYGWIN on i686 (Source distribution)


TRY1:setup.exeを使ってインストール 


setup.exeを使うとインストールは問題なく完了しますが、起動時に問題が。

■mysql のdataディレクトリの設定
データ保存ディレクトリを/e/work/lib/mysql_dataに。

$cd /usr/bin
$vi  ./mysq_install_db
ldatadir="/e/work/lib/mysql_data"

■mysql_dbのセットアップ
$ ./mysql_install_db

これは成功。設定ファイルをコピー。

$ cp my-medium.cnf /etc/my.cnf

この先で問題が。mysql用のユーザーを作成したものの、
$ net user kinoko /add /fullname:kinoko /comment:'mysql user account' /homedir:"$(cygpath -w /home/kinoko)"

このユーザーを使って
$ ./mysqld_safe --user=kinoko &

を実行するとエラー。
(実行時にデータ保存先やエラーログファイルを指定したければ、--datadir=/usr/local/mysql/data --log-error=/var/log/mysql.log & というようなオプションをつけます。

エラー内容は、(抜粋)
chown: invalid user: `kinoko'

見ると/etc/passwdにkinokoが追加されておらず。Windowsを再起動してログイン画面を見るとkinokoさんが増えているので、Windowsにとってはユーザが存在しているようす。

adduserを使おうと考えましたがCygwinにはないようなので、いろいろ試しましたが結局うまくいかず断念です。

・CygwinはLinuxと違いrootユーザーがいない
・adduser(useradd)がないのでunixライクにユーザーの追加ができない。
・net user を使うと追加できているが、/etc/passwdに反映されない。

※追記:
調べてみるとWindowsのユーザーをcygwinのユーザーに追加する方法がありました。

$mkpasswd -l -u USERNAME >> /etc/passwd

試してみました。

$mkpasswd -l -i kinoko >>/etc/passwd
$mysqld_safe --user=kinoko &

(略)

$ mysqlshow.exe -u kinoko

+--------------------+
|     Databases         |
+--------------------+
| information_schema |
| test                       |
+--------------------+

成功です・・!


TRY2: Windows版インストーラを使ってインストール


install_dirとdata_dirを変更するとエラーになりました。
エラーログは、
1: Folder: E:\work\mysql_data\
1: Folder: E:\work\mysql_data\data\
1: The installer has insufficient privileges to access this directory: E:\work\mysql_data\data. The installation cannot continue. Log on as administrator or contact your system administrator.

これを手がかりに探すと似た古いログがありましたが、(2005年)
【mysqlをインストールしたディレクトリとdata_dirのドライブが違う場合、アップデートの際にこのエラーが発生する】
ということだし、install_dirとdata_dirは同じドライブなので該当しません。

insufficient privilegesということで、パーミッションのせいかと思い777に変更してみたものの、
1: Failed to set security descriptor on object E:\work\mysql_data\, system error: -2147024891

というエラー。

結局、試しに2つのディレクトリ指定をデフォルトでやってみるとインストール成功。
ただ、デフォルトのCドライブは残り容量がないので、

$ df -h
C:               40G   40G  426M  99% /c

アンインストールしました。

TRY:3 ソースからインストール


Download MySQL Community ServerからSourceCodeをDL.

GCCのバージョンが低かったのでDL。

2.10 Installing MySQL from source を読むとインストール後の話がかいてあり、
mySQL Source Configuration Options を参考にcmake。

install_dir = /e/mysql
data_dir = /e/mysql_data
として、紆余曲折のすえ、

$ cmake . -DCMAKE_INSTALL_PREFIX=/e/mysql -DMYSQL_DATADIR=/e/mysql_data -DDEFAULT_CHARSET=utf8 2>>stderr.log 1>>stdout.log


$ cat stderr.log
/usr/bin/getconf: Unrecognized variable `LEVEL1_DCACHE_LINESIZE'
Warning: Bison executable not found in PATH
CMake Error at unittest/gunit/CMakeLists.txt:170 (ADD_LIBRARY):
  Cannot find source file:

    /e/Software/mysql/mysql-5.6.10/source_downloads/gmock-1.6.0/src/gmock-all.cc

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx
というエラーににたどり着いたものの、
最初の
/usr/bin/getconf: Unrecognized variable `LEVEL1_DCACHE_LINESIZE'
を調べてみると、

$strings /usr/bin/getconf |grep -i LEVEL1_DCHACHE_LINESIZE
$

該当なしでした。
getconfを探そうとしたところ、cygwinパッケージにはないという話があり、パッケージリストにもないので、最初から入っているのは何なんだろ・・?と思いながらこのへんで終了することにしました。