2018年5月24日木曜日

プロキシMySQL :: HAproxy || ProxySQLとKeepAlived


だからあなたのMySQLトラフィックをルーティングする場合、いくつかのオプションが存在します。 

今私はHAproxyがクライアントとより頻繁に使用されるのを見てきましたが、設定するのはかなり簡単です。 Perconaには興味のある人の例があります:

個人的に私はProxySQLが好きです。 Perconaにもこれに関するブログはほとんどありません
PerconaにもProxySQLバージョンがあります

私はいくつかの例を書いてみることを考えていましたが、ペルコナ全体がそれをとてもうまく説明しました。 私はそれらの投稿から何かを取り除きたくない、代わりにそれらのURLを介して多くの良い情報が利用可能であることを指摘する。 だからすでに書かれたものを書き換えるのではなく、私は興味のある人のための情報のコレクションを作成します。

最初に自分が必要と望むものを比較して決定します。 以下のリンクはもちろん、ProxySQLに偏っていますが、全体的な検討範囲が与えられます。
クラスタやマスターをマスタリングしていて、どのサーバーに接続していても、書き込みと読み取りがどちらになるかは気にしません。 HAproxyはシンプルな設定が可能です。

ProxySQLの特典は、トラフィックを簡単に重み付けして並べ替えることができます。 したがって、書き込みをノード1に行って、ノード2とノード3からプルを選択することができます。これに関するドキュメントは、次の場所にあります。
はい、HAproxyで実行できますが、それに応じてアプリケーションに指示する必要があります。
これは、クエリルールに基づいてProxySQLで処理されます。

今ここで明らかな質問:はい、どのようにProxySQLを単一障害点にしないようにしますか?

あなたは堅牢なロードバランサやetcなどを投資することができます。ハードウェアを投げてください....または自分で簡単にしてオープンソースをサポートし、 KeepAliveを使用してください。 これは設定が非常に簡単で、そのすべてがここでもうまく文書化されています:
あなたがluaとmysql-proxyを扱ったことがあるならば、ProxySQLとKeepalivedは非常に簡単です。 それでも何らかの理由でそれが必要な場合: https : //launchpad.net/mysql-proxy

HAproxy、ProxySQL、または別のソリューションを選択した場合でも、単一障害点を別の障害点に置き換えないようにする必要があります。 あなたがプロキシを使用している場合、これをしない理由はほとんどありません。

ProxySQLについてもう少し詳しく説明します。

http://anothermysqldba.blogspot.com/2018/05/proxy-mysql-haproxy-proxysql-keepalived.html

2018年3月20日火曜日

MySQL 8.0.4rc

MySQL 8.0.4rcは、「 一般公開前のドラフト:2018-03-19 」としてリリースされました 。 

私は素早く覗いて、ここに私の印象を書き留めることにしました。 このリリースはしばらく話されていたので、これはいくつかの古いニュースですが、とにかく私の考えを追加しました。

私が気づいた最初のことは、更新されたmysqlクライアントを使うという簡単な問題でした。 私の古いバージョンはまだ私の道に残っていた

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded
簡単な修正と有効な最新のmysqlクライアントを使用していることを確認してください。 もちろん、認証プラグインをmysql_native_passwordに戻して変更するなど、他のオプションも存在しましたが、なぜセキュリティメソッドを使用するのか気にしないでください。 これはセキュリティの非常に優れた拡張です。このより安全な方法を使用して接続を取得しているときに接続の問題がある場合は、驚かないでください。


Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 8.0.4-rc-log

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

だから最初の非常にクールな強化...

mysql> show create table user\G
*************************** 1. row ***************************
テーブル:ユーザー
テーブルの作成:CREATE TABLE `user`(
`Host` char(60)COLLATE utf8_bin NOT NULL DEFAULT ''、
`User` char(32)COLLATE utf8_bin NOT NULL DEFAULT ''、
`Select_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Insert_priv` enum( 'N'、 'Y')CHARACTER SET utf8 NOT NULL DEFAULT 'N'、
`Update_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Delete_priv`列挙型( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Create_priv`列挙型( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Drop_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Reload_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Shutdown_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Process_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`File_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Grant_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`References_priv` enum( 'N'、 'Y')CHARACTER SET utf8 NOT NULL DEFAULT 'N'、
`Index_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Alter_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Show_db_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Super_priv` enum( 'N'、 'Y')CHARACTER SET utf8 NOT NULL DEFAULT 'N'、
`Create_tmp_table_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Lock_tables_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Execute_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Repl_slave_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Repl_client_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Create_view_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Show_view_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Create_routine_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Alter_routine_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Create_user_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Event_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Trigger_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Create_tablespace_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`ssl_type` enum( ''、 'ANY'、 'X509'、 'SPECIFIED')キャラクタセットutf8 NOT NULL DEFAULT ''、
`ssl_cipher` blobはNULLではありませんが、
`x509_issuer`ブロブはNULLではない、
`x509_subject` blob NOT NULL、
`max_questions` int(11)unsigned NOT NULL DEFAULT '0'、
`max_updates` int(11)unsigned NOT NULL DEFAULT '0'、
`max_connections` int(11)unsigned NOT NULL DEFAULT '0'、
`max_user_connections` int(11)unsigned NOT NULL DEFAULT '0'、
`plugin` char(64)COLLATE utf8_bin NOT NULL DEFAULT 'caching_sha2_password'、
`authentication_string`テキストCOLLATE utf8_bin、
`password_expired` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`password_last_changed`タイムスタンプNULL DEFAULT NULL、
`password_lifetime` smallint(5)符号なしDEFAULT NULL、
`account_locked`列挙型( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Create_role_priv` enum( 'N'、 'Y')キャラクタセットutf8 NOT NULL DEFAULT 'N'、
`Drop_role_priv` enum( 'N'、 'Y')文字セットutf8 NOT NULL DEFAULT 'N'、
`Password_reuse_history` smallint(5)unsigned DEFAULT NULL、
`Password_reuse_time` smallint(5)unsigned DEFAULT NULL、
PRIMARY KEY( `Host`、` User`)
)/ *!50100 TABLESPACE `mysql` * / ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin STATS_PERSISTENT = 0 COMMENT = 'ユーザーとグローバル特権'
1行セット(0.00秒)

YEPのユーザーテーブルはInnoDBであり、独自のTableSpaceを持っています。

新しいデータディクショナリを追加すると、Information_schemaの変更が通知されます。
したがって、単純な例として、Columnsテーブルは歴史的にビューではありませんでしたが、現在は変更されています。


mysql> show create table COLUMNS \G
*************************** 1. row ***************************
表示:列
ビューの作成:CREATE ALGORITHM = UNDEFINED DEFINER = `mysql.infoschema` @` localhost`

これは、information_schemaでのパフォーマンスを助けるために行われるように見えますが、クエリごとの一時テーブルの作成を削除してinformation_schemaにします。

ドキュメントの第14章でこれについて深く掘り下げて説明します。詳細は以下のURLを参照してください。
また、前述のデータディクショナリは、アトミックデータ定義言語(DDL)文またはアトミックDDLを持つことができます。


新しいMySQL 8.0インスタンスへのレプリケーションを設定する前にクエリを確認しないと、これはいくつかのトランザクションを呼び起こす可能性があります。 テーブルメンテナンスの取り扱いにどのような影響が及ぶかという理由で、私はそれを言います。 "If Exists"というクリーンなクエリを書くと、大きな問題にはなりません。 全体的に、データとロールバックのオプションを保護する、より多くのトランザクションベースの機能です。


リソース管理は非常に興味深く見えます.MySQL 8.0の新機能であるため、これに重点を置くためにはもっと時間をかけなければなりません。 全体的にグループを割り当て、クエリの優先度を設定する必要はなく、クエリの振る舞いやリソースの割り当て方法をグループ化することができます。

mysql> select @@version;
+------------+
| @@バージョン|
+ ------------ +
| 5.7.16-log |
+ ------------ +
1行セット(0.00秒)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
ERROR 1109(42S02):information_schemaの 'RESOURCE_GROUPS'テーブルが不明です

mysql> select @@ version;
+ -------------- +
| @@バージョン|
+ -------------- +
| 8.0.4-rc-log |
+ -------------- +
1行セット(0.00秒)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| フィールド| タイプ| Null | キー| デフォルト| 余分な|
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| RESOURCE_GROUP_NAME | varchar(64)| NO | | NULL | |
| RESOURCE_GROUP_TYPE | 列挙型( 'SYSTEM'、 'USER')| NO | | NULL | |
| RESOURCE_GROUP_ENABLED | tinyint(1)| NO | | NULL | |
| VCPU_IDS | ブロブ| はい | NULL | |
| THREAD_PRIORITY | int(11)| NO | | NULL | |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
5行セット(0.00秒)


InnoDBバッファプールのキャッシュに関する詳細は、現在使用可能なインデックスに関するものです。

mysql> desc INFORMATION_SCHEMA.INNODB_CACHED_INDEXES ;
+----------------+---------------------+------+-----+---------+-------+
| フィールド| タイプ| Null | キー| デフォルト| 余分な|
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
| SPACE_ID | int(11)unsigned | NO | | | |
| INDEX_ID | bigint(21)署名なし| NO | | | |
| N_CACHED_PAGES | bigint(21)署名なし| NO | | | |
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
3行セット(0.01秒)


InnoDBバッファプールを設定する方法が不明な場合は、log_sizesまたはflushメソッドを使用して、使用可能なメモリに基づいてMySQLを設定します。

innodb_dedicated_server

[mysqld]
innodb-dedicated-server=1

mysql> select @@ innodb_dedicated_server;
+ --------------------------- +
| | @ innodb_dedicated_server |
+ --------------------------- +
| 1 |
+ --------------------------- +

この単純なテストでは、innodb_buffer_pool_sizeを6GBに設定しています(デフォルトは128MBです)。

数多くのJSONの追加と、正規表現の変更が行われました。 どちらも有望です。

このリリース自体のレプリケーションの強化は、コンパクトバイナリ形式を使用したJSONドキュメントの部分的な更新のバイナリログをサポートするようになりました。

しかし、全体的に多くの機能が利用できます( ここではそのすべてを読むことができます )。そのうちの1つ(クライアントが明日持っていたがっています)は、チャネルごとの複製ファイルです。
私のテストインスタンスはすでにバイナリログを有効にしていましたが、デフォルトではTABLEとファイルベースのマスター&スレーブ情報がデフォルトでオンになっています。

全体的に、これはこのリリースでの最初の一見とそれに対する非常に高いレベルの考えであり、他にも多くの変更が存在することに留意してください。 このリリースに関する他のブログ投稿や、 マニュアルリリースノートを見ることも役立ちます。 管理、セキュリティ、レプリケーションの観点から非常に有望であるように見えるので、確かにダウンロードしてレビューしてください。

2018年3月14日水曜日

MySQLのチートシート

だから私はいつか私がすべきだと思ったように投稿した。 私はまだMySQLと関連するフォークと一緒に働いていてとても忙しく、私が思うようにブログを出していませんでした。 だから、私はそれに取り組むでしょう。 

先日、私はそれが一般的なVIチートシートリストだったので、私が愛していたウェブサイトを思い出しました。 あなたが知っている構文、あなたはそれが必要であることを知っていますが、それが正しいまで3回タイプします。 それはあなたがそれを見て右に入力されると、私はすでにそれを書いたと思った。 

だから私は、一般的なMySQLコマンドの単純なリストではなく、毎月50回タイプするか、手の後ろのように知っているべきですが、クライアントが私たちの肩を見ているときを忘れてしまいます。 
まずは.. 
私たちは新しいMySQL 5.7.6+サーバを設定し、ログインします。 
パスワードを変更する必要があります。 しかし、それはパスを設定しないでユーザーを変更することです。 
パスワードをそのままクリアテキストで読む方法を知りたい。 

ALTER USER 
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass'; 
パスワードを設定する 
SET PASSWORD FOR 'bob''@'localhost' = PASSWORD('cleartext password'); 

パージバイナリログ 
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 00:00:00
PURGE BINARY LOGS BEFORE NOW() - interval 3 DAY;

MySQLダンプ 
# COMPACT WILL REMOVE DROP STATEMENTS
mysqldump --events --master-data=2 --routines --triggers --compact --all-databases > db.sql
mysqldump --events --master-data=2 --routines --triggers --all-databases > NAME.sql
mysqldump --opt --routines --triggers dbname > dbname.sql
mysqldump --opt --routines --triggers --no-create-info joomla jforms > dataonly.sql 

外部キーを一瞬オフにする 
SET GLOBAL foreign_key_checks=0; 



助成金をスキップする 
/usr/bin/mysqld_safe --defaults-file=/etc/mysql/my.cnf --skip-grant-tables
vi /etc/mysql/my.cnf
[mysqld]
skip-grant-tables


BinLogのレビュー 
--base64-output = DECODE-ROWS&--verbose 
mysqlbinlog --defaults-file=/home/anothermysqldba/.my.cnf --base64-output=DECODE-ROWS --verbose binlog.005862 > 005862.sql

MYSQLの安全なクライアント 
mysql_config_editor print --all
mysql_config_editor set --user=mysql --password --login-path=localhost --host=localhost
mysql --login-path=localhost -e 'SELECT NOW()';

スワップ 
sudo swapoff -a
To set the new value to 10: echo 10 | sudo tee /proc/sys/vm/swappiness
sudo swapon -a 

情報スキーマが遅い場合 
set global innodb_stats_on_metadata=0; 

AWS変数 
CALL mysql.rds_show_configuration;
> call mysql.rds_set_configuration('binlog retention hours', 24);
> call mysql.rds_set_configuration('slow_launch_time', 2);

列名が入っているテーブルを見つける 
SELECT TABLE_SCHEMA , TABLE_NAME , COLUMN_NAME FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'fieldname' ; 
クライアントはTableAにあると言っていますが、50のデータベースがあります。 
SELECT TABLE_SCHEMA , TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = 'TableA' ; 

奴隷労働者を調整する 
Select @@slave_parallel_workers;
Stop Slave; Set GLOBAL slave_parallel_workers=5; Start Slave;

MySQLマルチ 
5.6>
To start both : mysqld_multi start 1,2
To check on status of both: mysqld_multi report 1,2
To check on status or other options you can use just one

5.7<
[mysqld1] BECOMES [mysqld@mysqld1]
systemctl start mysqld@mysqld1
systemctl start mysqld@mysqld2
systemctl start mysqld@mysqld3
systemctl start mysqld@mysqld4 
MySQLアップグレードシステムテーブルのみ 
mysql_upgrade --defaults-file=/home/ anothermysqldba /.my.cnf --upgrade-system-tables 

スキップ・レプリケーション・エラー 
STOP SLAVE; SET GLOBAL sql_slave_skip_counter =1; START SLAVE; SELECT SLEEP(1); SHOW SLAVE STATUS\G 

2017年10月14日土曜日

MySQL InnoDBテーブルスペース暗号化

MySQL Tablespace暗号化は設定が比較的簡単です。 MySQL 5.7、innodb_file_per_tableを使用する必要があります 


MySQLのドキュメントには、これを設定するために必要なものすべてが含まれています。 


しかし、リンクを共有しただけでは私のブログ投稿は非常に短くなります。 そう.... 

アップグレード後、MySQL 5.7では、キーファイルの有効な場所が必要です。 私はMySQLのdatadirを/ var / lib / mysql / dataとして持っています。これにより、必要に応じてデフォルトの場所を見つけることができますが、必要に応じてさらに多くのディスクを簡単にマウントできます。 これにより、/ var / lib / mysqlがすでに許可されているため、selinuxなどの追加編集を行う必要もありません。 

/ var / lib / mysql / keyringをタッチする 
chmod 750 / var / lib / mysql / keyring * 
chown mysql:mysql / var / lib / mysql / keyring 

mysql .cnfファイルを編集します。 

ls /usr/lib64/mysql/plugin/keyring_file.so 
/usr/lib64/mysql/plugin/keyring_file.so 

[mysqld] 
#Keyring Pluginのインストール 
early-plugin-load = keyring_file.so 
keyring_file_data = / var / lib / mysql / keyring 

MySQLの起動後にあなたのプラグインをチェックしてください: 

mysql> SELECT PLUGIN_NAME、PLUGIN_STATUS 
- >情報シチェラから 
- > WHERE PLUGIN_NAME LIKE 'キーリング%'; 
+ -------------- + --------------- + 
| PLUGIN_NAME | PLUGIN_STATUS | 
+ -------------- + --------------- + 
| keyring_file | アクティブ| 
| keyring_udf | アクティブ| 
+ -------------- + --------------- + 


プラグインをインストールするkeyring_udf SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_generate RETURNS INTEGER SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_fetchストリングSONAMEを戻します 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_length_fetch INTEGER SONAMEを戻します。 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_type_fetchストリングSONAMEを戻します 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_store戻り値INTEGER SONAME 'keyring_udf.so'; 
CREATE FUNCTION keyring_key_remove RETURNS INTEGER SONAME 'keyring_udf.so'; 


mysql>テストを使用する。 
mysql> SELECT keyring_key_generate( 'MyKey1'、 'AES'、32); 

mysql> CREATE TABLE `enc_test`( 
`enc_test_id` varchar(255)NOT NULL、 
PRIMARY KEY( `enc_test_id`) 
)ENGINE = InnoDB; 

mysql>テーブルを変更するtest.enc_test encryption = 'Y'; 

mysql> show create table enc_test \ G 
**************************** 1.行******************** ******* 
テーブル:enc_test 
テーブルの作成:CREATE TABLE `enc_test`( 
`enc_test_id` varchar(255)NOT NULL、 
PRIMARY KEY( `enc_test_id`) 
)ENGINE = InnoDB DEFAULT CHARSET = latin1 ENCRYPTION = 'Y' 
1行セット(0.00秒)