MySQL/MariaDB SQL チートシート


MySQL/MariaDB のデータベースをコマンドラインから作成するときとかのよく使う CLI コマンドをまとめたものです。

完全に自分用です。

concrete5 でメンテに使うコマンドとかもひっそりと含んでいます。

Create DB and user / DB を作成してユーザーを加える

Non-RDS

CREATE DATABASE dev-c5db DEFAULT CHARACTER SET=utf8mb4;

GRANT ALL PRIVILEGES ON `dev-c5db`.* TO `dev-c5dbuser`@`127.0.0.1` IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `dev-c5db`.* TO `dev-c5dbuser`@`localhost` IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `dev-c5db`.* TO `dev-c5dbuser`@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `dev-c5db`.* TO `dev-c5dbuser`@`Additional IP` 

FLUSH PRIVILEGES;

AWS RDS

AWS RDS だと ALL PRIVILEGES が許可されていないようなので、個別にすべての権限を与える必要がありました。

CREATE DATABASE dev-c5db DEFAULT CHARACTER SET=utf8mb4;
GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, INDEX, ALTER, LOCK TABLES, EXECUTE, CREATE TEMPORARY TABLES,TRIGGER, CREATE VIEW, SHOW VIEW, EVENT on `dev-c5db`.* TO `dev-c5dbuser`@`127.0.0.1` identified by 'password';
GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, INDEX, ALTER, LOCK TABLES, EXECUTE, CREATE TEMPORARY TABLES,TRIGGER, CREATE VIEW, SHOW VIEW, EVENT on `dev-c5db`.* TO `dev-c5dbuser`@`localhost` identified by 'password';
GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, INDEX, ALTER, LOCK TABLES, EXECUTE, CREATE TEMPORARY TABLES,TRIGGER, CREATE VIEW, SHOW VIEW, EVENT on `dev-c5db`.* TO `dev-c5dbuser`@'%' identified by 'password';
GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, INDEX, ALTER, LOCK TABLES, EXECUTE, CREATE TEMPORARY TABLES,TRIGGER, CREATE VIEW, SHOW VIEW, EVENT on `dev-c5db`.* TO `dev-c5dbuser`@`Additional IP` identified by 'password';

Root パスワードを変更する (MariaDB 等)

MariaDB 10.4 ぐらいから、ssh のログインユーザー認証で MariaDB の root で入ることができるようになっています。元のようにパスワード認証が良い人は、MariaDB サーバーインストール後に root パスワードを設定します。

$ mysql -u root
ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("パスワード")
FLUSH PRIVILEGES;
exit;

Clear database / DB をクリアする。

DB を削除しないで中身をクリアする。

mysqldump -h [mysql_address] -u [mysql_username] -p --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [mysql_username] -p  -h [mysql_address] [database_name]

mysqldump -h [mysql_address] -u [mysql_username] -p --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [mysql_username] -p [database_name]

mysqldump -u${user} -p${pass} -h ${host} --add-drop-table --no-data ${database} | grep ^DROP | mysql -u${user} -p${pass} -h ${host} ${database}

Foreign Key エラーが出た時

mysqldump -u${user} -p${pass}] -h ${host} \
  --add-drop-table --no-data ${database} | \
  grep -e '^DROP \| FOREIGN_KEY_CHECKS' | \
  mysql -u${user} -p${pass} ${database}

DB を削除、再度作成して同じユーザーに権限を与える。

DROP DATABASE `dev-db`;
CREATE DATABASE `dev-db` DEFAULT CHARACTER SET=utf8mb4;
GRANT ALL PRIVILEGES ON `dev-db`.* to `dev-dbuser`@`127.0.0.1` WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `dev-db`.* to `dev-dbuser`@`localhost` WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `dev-db`.* to `dev-dbuser`@`XXX.XXX.XXX.XXX` WITH GRANT OPTION;
FLUSH PRIVILEGES;

mysqldump + gzip

mysqldump から 直接 gzip する

mysqldump -h [origin host] -u [origin DB User] --password="[origin Password]" [origin DB Name] | gzip > [Filename]

おまけ:ファイルの末尾に日時を追加する

mysqldump -h [origin host] -u [origin DB User] --password="[origin Password]" [origin DB Name] | gzip > [Filename]_$(date +%Y%m%d%H%M%S).gz

MySQL コピー

ファイルを作成せず、パイプしてデータをコピーする

mysqldump -h [origin host] -u [origin DB User] --password="[origin Password]" [origin DB Name] | mysql -h [dest host] -u [dest DB User] --password="[dest Password]" [dest DB Name]

Concrete CMS 関連

File Storage Location from 2 to 1

すべてのファイルの保存場所を手動で変更する。

UPDATE `Files` SET fslID=REPLACE(fslID, 2,1);

Update user data

Batch change Concrete CMS User data

Concrete CMS ユーザーのメールアドレスを強制変更する。
本番環境から開発環境に移行する時に個人情報を削除する目的で。
ただし、ユーザー属性の情報は削除していないので気をつけて。

UPDATE Users SET uEmail=REPLACE(uEmail, "original", "example");
UPDATE Users SET uEmail=REPLACE(uEmail, "original", "example"); 
UPDATE Users SET uEmail=CONCAT(uName, '@example.com');

UPDATE Users SET uEmail=CONCAT(uName, '@example.com') WHERE uEmail NOT LIKE  "%@concrete5.co.jp";

UPDATE Users SET uName=uID WHERE uID NOT LIKE  "1";
UPDATE Users SET uEmail=CONCAT(uID, '@example.com') WHERE uEmail NOT LIKE  "%@concrete5.co.jp";

Get latest entries of Log

use [CCM データベース名]
Select * From Logs ORDER BY logID DESC LIMIT 10;

Replace URL

UPDATE atDefault SET value = REPLACE(value, 'http://example.com', 'http://example.net');
UPDATE btContentLocal SET content = REPLACE(content, 'http://example.com', 'http://example.net');

MySQL ユーザー権限

mysqlに切り替え

USE mysql

登録されているユーザを確認

SELECT user, host FROM user;

権限を表示

SHOW GRANTS for 'user'@'%';
SHOW GRANTS for 'user'@'127.0.0.1';
SHOW GRANTS for 'user'@'localhost';

MySQL 設定

設定情報を参照

SHOW GLOBAL VARIABLES;
use [db];
SHOW VARIABLES;

MySQL システム

Upgrade MySQL Client

sudo yum remove mysql-community-client mysql-community-common mysql-community-devel mysql-community-libs mysql-community-libs-compat
sudo yum-config-manager --disable mysql57-community
sudo yum-config-manager --enable mysql80-community
sudo yum install mysql-community-client mysql-community-common mysql-community-devel mysql-community-libs mysql-community-libs-compat MySQL-python net-snmp php-snmp postfix

Copy MySQL from one to another

# Format
mysqldump -h [old HOST] -u [old USER] [old DB] | mysql -h [new HOST] -u [new USER] [new DB]
# Sample
mysqldump -h 127.0.0.1 -u root c5demo_802 | mysql -h 127.0.0.1 -u root c5demo_prb