PDOでMySQLの操作をしてみる

PHP7での話し。
PHP7ではMDB2が動かなかったので、PDOでDB操作をしてみたの。

かなり簡単だけどサンプルコードを作ってみましたのよ。

# DB接続
$con = new PDO("mysql:host=$host;dbname=$dbname", $usr, $passwd);

# 検索
$select = "SELECT count(*) as cnt FROM mail WHERE mail = '$mail'";
$stmt = $con->query($select);
if(!$stmt){
	echo '検索に失敗しました。';
	exit;
}
$cnt = $stmt->fetch(PDO::FETCH_ASSOC);

if(!$cnt["cnt"]){
	# データ登録
	$insert  = "INSERT INTO mail (mail, date) ";
	$insert .= "VALUES('$mail', '".date("Y-m-d H:i:s"). "')";
	if(!$con->query($insert)){
		echo 'データの登録に失敗しました。';
		exit;
	}
}

$stmt = null;// クリア
$con = null;// クリア

AWSのRDSでMySQLのdumpをする方法

AWSのRDSでMySQLのdumpをする方法。
スナップショットではなくて実データが欲しいときありますよね。
サーバー移転時とか。

スナップショットはRDSの管理画面から行えますが、dumpをする場合は下記のように行えます。

EC2にSSHでログインして下記を実行

mysqldump -h zeroone.ieecae89jne3n2.ap-northeast-1.rds.amazonaws.com -u zero1 -p zero1 > ./dump.sql

そうするとEC2側にdumpファイルが作成されるので、それをFTPでダウンロードする。

これでOK

MySQLのsql_modeについて

またまた移転時のネタ

移転後の動作チェックでINSERT文で下記のエラーが発生

Incorrect integer value: ” ~~~
こんなSQLがNGです。
INSERT INTO table (id, value) VALUES(”, ‘OK’);

auto_incrementのカラムに”を指定している部分でのエラーのようです。
色々調べてみるとsql_modeの設定が影響しているようです。

my.cnfかSQLで設定調整ができるようです。

my.cnfはroot権限、SQLでもMySQLのroot権限が必要です。

MySQLにroot権限でログインします。

$ mysql -u root -p
password:
> use データベース名

設定状況を確認します。

> SHOW GLOBAL VARIABLES LIKE 'sql_mode';

設定をします。

> SET GLOBAL sql_mode=NO_ENGINE_SUBSTITUTION;

これでINSERTでエラーがでなくなりました。

MySQLのリストア

MySQLのデータをリストア

$ mysql -u ユーザー名 -pパスワード名 --default-character-set=文字コード データベース名 < バックアップファイル名

※-pとパスワード名は間をあけない。

gzで圧縮している場合はパイプさせる。

zcat SQLファイル.gz | mysql -u ユーザー名 -pパスワード名 --default-character-set=文字コード データベース名

パスワードの警告がでますけど、処理は続行されます。

phpMyAdminでユーザーの新規追加で困った

phpMyAdminでユーザーの新規追加をしようとしてエラー

phpMyAdmin:4.7.6
MySQL:5.7

困った困った。

#1819 – Your password does not satisfy the current policy requirements

「パスワードが現在のポリシー要件を満たしていない」ということです。
英数字、大文字、小文字、記号を含めたパスワードにすると解決です。

phpMyAdminの「パスワードを生成する」のボタンでは上記ポリシーをクリアできてないので注意ですね。

SQLで直接実行するとユーザーの追加ができるので、今回はそちらで対応

CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';

ユーザー追加後にDBを追加したり、ユーザーの編集で接続するDBを指定したりしましょう。

rootのパスワードを忘れた場合

rootのパスワードを忘れた!

MySQLを終了

# kill `cat /var/run/mysqld/mysqld.pid`

MySQLを設定テーブルをスキップさせて起動

# /usr/libexec/mysqld --skip-grant-tables &

ログイン(パスワードなしでログインできる)

# mysql -u root mysql

パスワードを再設定

> UPDATE user SET Password=PASSWORD('パスワード') WHERE User='root';
> FLUSH PRIVILEGES;
> \q

MySQLを終了

# kill `cat /var/run/mysqld/mysqld.pid`

通常起動

# /etc/rc.d/init.d/mysqld start

MySQLのバックアップ(mysqldump)を使ってみる

MySQLのバックアップ(mysqldump)を使ってみる

データ量が多いDBだとphpMyAdminからはデータエクスポートに時間がかかるorタイムアウトになる。
そういうときはコマンドからdumpしちゃいましょうって話

コマンドもMySQLのバージョンで警告がでるみたい。

昔は下記のコマンドで行けてた

/usr/bin/mysqldump --opt --user=USER --password=PASSWORD DATABASE > bkup.sql

そうすると下記の警告が発生。
(バージョン5.6から出るようになりました)

Warning: Using a password on the command line interface can be insecure.

警告なので無視することもできるのだけど。
気分的に良くないのでちゃんと手直ししてみましょう。

警告文はパスワードをコマンド上に表示させるのはセキュリティ上よくないぜよ と言っております。

コマンドに出さないようにするためにはパスワードを保存しておくファイルを作成して
それを読み込んであげることで回避できます。

まずはパスワードを保存しておくファイルを作成します。
ファイル名:mysql.cnf

中身↓

[client]
user = hoge
password = hogehoge
host = 192.168.1.1

そしてコマンドは下記!
※–default-fileは一番最初に指定します。

mysqldump --defaults-file=mysql.cnf --opt DATABASE > bkup.sql

ちなみにmysql.cnfにdatabase=hoge とデータベース名を入れると下記の警告がでます。

Warning: Using unique option prefix database instead of databases is deprecated and will be removed in a future release. Please use the full name instead.
Warning: mysqldump: ignoring option ‘–databases’ due to invalid value ‘hoge’

設定ファイルにdatabaseは指定しないほうが良いですね。