MySQLについて
SQL
データ操作
1
2
3
4
5
6
7
8
| # テーブルを複製して新しいテーブルを作成する
create table new_table like src_table;
# データも含めたテーブルを複製して新しいテーブルを作成する
create table new_table select * from src_table;
# Selectした結果をInsertする
insert into to_table * from from_table;
|
存在確認
1
| SELECT EXISTS(SELECT 1 FROM example_table WHERE ...)
|
https://teratail.com/questions/1281
データベース管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| # ユーザー作成
create user qa identified by 'L1g0x5DBJU';
# 権限付与
GRANT ALL PRIVILEGES ON `qa`.* TO 'qa'@'*';
# 権限再読み込み
FLUSH PRIVILEGES;
# テーブル調査
show columns from access_log;
# カラム名で検索
use information_schema
select table_schema, table_name, column_name from columns where column_name like '%email%';
# ユーザー削除
drop user 'qa'@'localhost';
# 権限確認
show grants for 'qa'@'localhost';
# パスワード変更
set password for 'qa'@'localhost' = password('pass');
# パラメータ変更
set global max_connections=4096;
# カラム削除
alter table drop column column_name
# trigger削除
drop trigger trigger_name
# Index追加
alter table access_log add index key_name(column_name)
# auto incrementの値確認
select table_name, auto_increment FROM information_schema.tables where auto_increment is not NULL
|
レプリケーション関連
マスタ情報の更新
1
2
3
4
5
| CHANGE MASTER TO MASTER_HOST='192.168.0.2',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='master-bin.000355',
MASTER_LOG_POS=2318600;
|
エラーのskip
1
2
3
| # エラーが出た時にskipする
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
|
binlogファイル操作
1
2
3
4
5
| # binlog一覧表示
show binary logs;
# 2019-04-01 00:00:00より前のbinlogを消す
PURGE BINARY LOGS BEFORE '2019-04-01 00:00:00';
|
Replication
バージョン違いのReplication
一つ下のバージョンをマスターとするサーバからのレプリケーションまでは対応している。
MySQL 5.6のマスターから MySQL5.7のスレーブへのレプリケーションはサポートしている。
https://dev.mysql.com/doc/mysql-replication-excerpt/5.7/en/replication-compatibility.html
Replication Filter
特定のDBのみをレプリケーション対象とする機能
オンラインで変更する場合は以下のコマンドにて行う
1
| mysql> change replication filter replicate_do_db = (db1, db2)
|
設定ファイルには下記のように複数行で記載する
1
2
3
| [mysqld]
replicate-do-db = db1
replicate-do-db = db2
|
パスワードを忘れた場合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# MySQL止める
sudo /etc/init.d/mysqld stop
# セーフモードで起動
sudo mysqld_safe --skip-grant-tables &
mysql -uroot
# 再設定
use mysql
update user set password=PASSWORD("password") where User='root';
# 起動
sudo /etc/init.d/mysqld stop
sudo /etc/init.d/mysqld start
|
ibdataからのリストア
- MySQLを構築
- ログイン
- 復旧したいデータベース・テーブルのDDLを流す。
- テーブルへの変更をLOCK
- テーブルスペースを削除(ibdファイルを削除)
- 復旧したいibdファイルで上書きする
- テーブルスペースをインポート
- Lockを解除
https://dev.mysql.com/doc/mysql-enterprise-backup/3.11/ja/partial.restoring.single.html
mysqldump
対象データベースを指定してdump
1
| mysqldump -u root -p --single-transaction --master-data=2 -B db1 db2
|
mysqladmin
MySQL管理用コマンド
サーバーの死活チェック
1
| mysqladmin ping -uroot -p
|
mysql_config_editor
難読化するだけだけど、shellにそのまま書いてあるよりかはまだまし。
1
| mysql_config_editor set --login-path=local --host=localhost --user=root --password
|
http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0057
mysqldiff
http://kakakakakku.hatenablog.com/entry/2017/04/02/105901
install
rpmとかだとamazon linuxだと依存を解消できなかった。
1
2
3
| tar xzf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
sudo python setup.py install
|
use
1
| mysqldiff --server1=user:password@host --server2=user:password@host --force --skip-table-options --changes-for=server1 schema:schema
|