MySQLが起動できなかったときに実施したこと「mysqld: Can’t create/write to file ‘/tmp/xxxxxxxxxx’ (Errcode: 13 – Permission denied)」エラー

MySQLを立ち上げようとしたらエラーが出て立ち上がらなかった。
systemctl start mysqld.service を実行すると以下のメッセージが出てくる。
Job for mysqld.service failed because the control process exited with error code. See “systemctl status mysqld.service” and “journalctl -xe” for details.

/var/log/mysqld.log ログを確認したところ、以下のエラーメッセージが出ていた。
mysqld: Can’t create/write to file ‘/tmp/xxxxxxxxxx’ (Errcode: 13 – Permission denied)

/tmpディレクトリの権限を変更した覚えはないけれど確認をすると775の権限になっていた。
これを777に修正したら起動することができた。

MySQLでカラム名を変更しようとしたらERROR 1067 (42000): Invalid default value for ‘column_name’メッセージが出力された

MySQLでカラム名を変更しようとしたらERROR 1067 (42000): Invalid default value for ‘column_name’メッセージが出力された。

原因
エラーの出力されたカラムはDATETIME型でデフォルト値が0000-00-00 00:00:00になっていた。
MySQLのsql_modeにNO_ZERO_IN_DATE、NO_ZERO_DATEが含まれていたためエラーとなっていた。

show variables like 'sql_mode' ;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+

対処内容
/etc/my.cnfの中にNO_ZERO_IN_DATE、NO_ZERO_DATEを除いてsql_modeの追加をする。

[mysqld]
sql-mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

/etc/my.cnfを追加したあとにMySQLを再起動する。

systemctl restart mysqld.service

環境
CentOS 7
MySQL 5.7.22

外部ホストからMySQLへ接続できるように設定をする

外部ホストのコマンドプロンプトからコマンドラインでMySQLへ接続しようとしたら以下のエラーメッセージが出力された。

> mysql.exe -u user_name -p -h ip_address
Enter password: ********
ERROR 1045 (28000): Access denied for user 'user_name'@'ip_address' (using password: YES)

環境
外部ホスト:Windows10
MySQLサーバ:CentOS7, MySQL5.7

原因
MySQLは初期設定では外部ホストより接続できる設定になっていないため。

対処
GRANT文を用いて外部ホストより接続できるような設定を行う。
(追記)
CREATE USER文でユーザを追加しても外部ホストから接続可能(むしろ、CREATE USERしてからGRANTするのが正しい)。

やりかた

# CentOS7からMySQLサーバに接続する。
mysql -u root -p

# GRANT文で外部ホストのIPアドレスからのアクセスを許可するユーザを追加する。
# もしくはCREATE USER文で外部ホストのIPアドレスを指定したユーザを追加する。
GRANT ALL ON database_name.* TO 'user_name'@'ip_address' IDENTIFIED BY 'password';
CREATE USER 'user_name'@'ip_address' IDENTIFIED BY 'password';

# (おまけ)MySQLに接続できないようにする。
DROP USER 'user_name'@'ip_address';

MySQLでユーザを追加しようとしたらYour password does not satisfy the current policy requirementsメッセージが表示された

MySQLでユーザを追加しようとしたら「Your password does not satisfy the current policy requirements」メッセージが表示された。
訳すと「あなたのパスワードは現在の必要要件を満たさない」ということか。
既存のシステムで使っているパスワードを変更することはできなかったのでパスワードの必要要件や変更方法を探してみる。

現在のパスワードの必要要件はどうやって調べればよいのか?
validate-password-puginがあって、そこにはこう書かれている。

LOW policy tests password length only. Passwords must be at least 8 characters long.

MEDIUM policy adds the conditions that passwords must contain at least 1 numeric character, 1 lowercase character, 1 uppercase character, and 1 special (nonalphanumeric) character.

STRONG policy adds the condition that password substrings of length 4 or longer must not match words in the dictionary file, if one has been specified.

validate_password_policyにはLOW、MEDIUM、STRONGの設定がありLOWが一番やさしい、STRONGが一番きびしい要件になっている。デフォルト値はMEDIUM。

LOWは最低8文字あればパスワードとして許容される。
MEDIUMは数字、大文字英字、小文字英字、記号が最低でも1文字ずつ入っている。かつ、最低8文字以上。
例としては「1Coffee!」はOK。「1Water!」は7文字なのでNG。

LOWに変えてみる。
変えたあとの内容を確認するとLOWになっていることがわかる。

SET GLOBAL validate_password_policy=LOW;
SHOW VARIABLES LIKE 'validate_password%';
# +--------------------------------------+-------+
# | Variable_name                        | Value |
# +--------------------------------------+-------+
# | validate_password_policy             | LOW   |

LOWにしてからユーザを登録すると「a」が8つはユーザ登録ができて「a」が7つはユーザ登録できなかった。

MySQL5.7で確認。

MySQLで1366エラーメッセージ

PythonでMySQLにデータを追加しようとしたら、エラーメッセージが出力された。
Warning: (1366, “Incorrect string value: ‘\\xE3\\x81\\xBB\\xE3\\x81\\x92…’ for column ‘hogehoge’ at row 1”)

調べたところ、文字コードに問題があるようだ。
現状の文字コード。

SHOW variables LIKE '%char%';
# +--------------------------+--------------------------------+
# | Variable_name            | Value                          |
# +--------------------------+--------------------------------+
# | character_set_client     | cp932                          |
# | character_set_connection | cp932                          |
# | character_set_database   | latin1                         |
# | character_set_filesystem | binary                         |
# | character_set_results    | cp932                          |
# | character_set_server     | latin1                         |
# | character_set_system     | utf8                           |
# | character_sets_dir       | C:\xampp\mysql\share\charsets\ |
# +--------------------------+--------------------------------+

utf8に合わせることにする。
Windowsなので、my.iniファイルを編集する。

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

修正後、MySQLを再起動する。
再度、文字コードを確認する。

# +--------------------------+--------------------------------+
# | 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       | C:\xampp\mysql\share\charsets\ |
# +--------------------------+--------------------------------+

my.iniの設定を変更しても相変わらずエラーがでるので更に調べたら、
テーブルのカラムごとに文字コードの照合順序があるということがわかった。
コマンドがわからなかったので、phpMyAdminからutf8_binに修正したところ、エラーがでなくなった。

MySQLのユーザに関する操作

MySQLのユーザに関する操作

# test-userユーザをパスワードなしで追加する。
CREATE USER testuser;

# パスワードありで追加する。
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'password';

# 追加されたことの確認をする。
SELECT user, host FROM mysql.user WHERE user='testuser';
# +----------+-----------+
# | user     | host      |
# +----------+-----------+
# | testuser | localhost |
# +----------+-----------+

# ユーザを削除する。
DROP USER 'testuser'@'localhost';

MySQLでCREATE DATABASEコマンド実行時にERROR 1064 (42000)が発生したとき

MySQLで以下のSQLを実行したとき。ERROR 1064 (42000)が発生した。


mysql> CREATE DATABASE database-name;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database-name' at line 1

どうやら、データベース名に「-」が含まれる場合、back quote「`」で囲う必要があるようだ。
以下ならOK。


mysql> CREATE DATABASE `database-name`;
Query OK, 1 row affected (0.00 sec)

知らなかった。

MySQLでよく使うコマンド

MySQLでよく使うコマンドを残しておく。特にINSERT INTOを良く忘れてしまう。


・データベースの作成
CREATE DATABASE database_name;
※データベース名に「-」が含まれる場合、back quote「`」で囲う必要がある。
CREATE DATABASE `database-name`;

・作成済みのデータベースの確認
SHOW DATABASES;

・データベースの削除
DROP DATABASE database_name;

・テーブルの作成
USE database_name;
CREATE TABLE table_name (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(255));

・作成済みのテーブルの確認
USE database_name;
SHOW TABLES;

・テーブルの定義の確認
DESC table_name;
DESCRIBE table_name;

・テーブルの削除
DROP TABLE table_name;

・INSERT文
INSERT INTO table_name (name) VALUE ('MySQL TAROU');

・SELECT文
SELECT * FROM table_name;
SELECT * FROM table_name\G

・UPDATE文
UPDATE table_name SET name = 'MySQL HANAKO';
※WHERE句を指定しないと、全部のレコードが更新されてしまう。

・DELETE文
DELETE FROM table_name;
※WHERE句を指定しないと、全部のレコードが削除されてしまう。

・そのほか、良く使うもの
WHERE句
UPDATE table_name SET name = 'MySQL HANAKO' WHERE id = 1;
DELETE FROM table_name WHERE id = 1;

ORDER BY句
データの取得順序を指定する。なにも指定しない場合は、ASC(昇順)になる。降順はDESC。
SELECT * FROM table_name ORDER BY id;
SELECT * FROM table_name ORDER BY id ASC;
SELECT * FROM table_name ORDER BY id DESC;

COUNT関数
データの個数を集計する。
SELECT COUNT(*) FROM table_name;