2018年5月24日星期四

代理MySQL :: HAproxy || ProxySQL&KeepAlived

所以当涉及到路由你的MySQL流量时,存在几个选项。 

现在我已经看到HAproxy更经常地与客户使用,这是非常简单的设置。 Percona为那些感兴趣的人提供了一个例子:

我个人喜欢ProxySQL。 Percona也很少有这方面的博客
Percona也有ProxySQL版本可用

我想我会写一些例子,但是整个Percona已经很好地解释了这一点。 我不想从这些帖子中拿走任何东西,而是指出通过这些网址可以获得很多好的信息。 因此,我不会重写已写入的内容,而会为感兴趣的人创建一组信息。

首先比较并决定你自己需要和想要什么。 当然,下面的链接会偏向ProxySQL,但它给你一个全面的范围供你考虑。
如果您拥有一个群集或主控要掌握,并且您不关心写vs vs读取到哪个服务器,只要您有连接; 那么HAproxy可能是一个简单的快速设置。

ProxySQL的优势在于能够以加权的方式对流量进行分类,简单易行。 所以你可以写入节点1,并从节点2和节点3选择拉。有关这方面的文档可以在这里找到:
是的,它可以通过HAproxy完成,但您必须相应地指导应用程序。
这是根据您的查询规则在ProxySQL中处理的。

现在显而易见的问题是:好的,那么如何让ProxySQL不会成为单点故障?

你可以投资是一个强大的负载平衡器等等等等......抛硬件......或者让自己容易,支持开源并使用KeepAlive d。 这是非常容易设置,所有这些都记录在这里:
如果你曾经处理lua和mysql-proxy ,ProxySQL和Keepalived应该对你来说非常简单。 如果您仍然希望出于某种原因: https : //launchpad.net/mysql-proxy

无论您选择HAproxy,ProxySQL还是其他解决方案,您都需要确保一旦发生单点故障而不会更换另一个故障点,并且keepalived非常适合。 如果你正在使用代理,那么没有这么做的理由是没有的。

所以ProxySQL上还有更多的东西。




2018年3月20日星期二

MySQL 8.0.4rc

MySQL 8.0.4rc剛剛發佈為“ Pre-General Availability草案: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`(
`主機`字符(60)COLLATE utf8_bin NOT NULL DEFAULT'',
`User` char(32)COLLATE utf8_bin NOT NULL DEFAULT'',
`Select_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Insert_priv` enum('N','Y')字符集utf8不為NULL默認'N',
`Update_priv`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`Delete_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Drop_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Reload_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Shutdown_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Process_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`File_priv`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`Grant_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`References_priv`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`Index_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Alter_priv`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`Show_db_priv` enum('N','Y')字符集utf8不為NULL默認'N',
`Super_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_tmp_table_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Lock_tables_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Execute_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Repl_slave_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Repl_client_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_view_priv`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`Show_view_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_routine_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Alter_routine_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_user_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Event_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Trigger_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Create_tablespace_priv` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`ssl_type`枚舉('','ANY','X509','SPECIFIED')字符集utf8不為NULL DEFAULT'',
`ssl_cipher` blob NOT NULL,
`x509_issuer` blob NOT 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`枚舉('N','Y')字符集utf8不為NULL DEFAULT'N',
`password_last_changed` timestamp NULL DEFAULT NULL,
`password_lifetime` smallint(5)unsigned DEFAULT NULL,
`account_locked` enum('N','Y')字符集utf8不為NULL DEFAULT'N',
`Create_role_priv`枚舉('N','Y')字符集utf8不為NULL默認'N',
`Drop_role_priv` enum('N','Y')字符集utf8不為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 ='用戶和全局權限'
一排(0.00秒)

是的,用戶表是InnoDB並擁有自己的TableSpace。

隨著新數據字典的添加,您現在將注意到Information_schema更改。
因此,作為一個簡單的示例,歷史上的Columns表格不是一個視圖,但現在已經發生變化,以及許多其他視圖,您可以通過所提供的網址查看。


mysql> show create table COLUMNS \G
*************************** 1. row ***************************
查看:COLUMNS
創建視圖: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;
+------------+
| @@ version |
+ ------------ +
| 5.7.16-log |
+ ------------ +
一排(0.00秒)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
錯誤1109(42S02):information_schema中的表“RESOURCE_GROUPS”未知

mysql> select @@ version;
+ -------------- +
| @@ version |
+ -------------- +
| 8.0.4-rc-log |
+ -------------- +
一排(0.00秒)

mysql> desc INFORMATION_SCHEMA.RESOURCE_GROUPS;
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| 字段| 類型| 空| Key | 默認| 額外|
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
| RESOURCE_GROUP_NAME | varchar(64)| NO | | NULL | |
| RESOURCE_GROUP_TYPE | 枚舉('SYSTEM','USER')| NO | | NULL | |
| RESOURCE_GROUP_ENABLED | tinyint(1)| NO | | NULL | |
| VCPU_IDS | blob | 是| | NULL | |
| THREAD_PRIORITY | int(11)| NO | | NULL | |
+ ------------------------ + ----------------------- + ------ + ----- + --------- + ------- +
5行(0.00秒)


關於InnoDB緩衝池緩存的更多信息現在可用。

mysql> desc INFORMATION_SCHEMA.INNODB_CACHED_INDEXES ;
+----------------+---------------------+------+-----+---------+-------+
| 字段| 類型| 空| Key | 默認| 額外|
+ ---------------- + --------------------- + ------ + --- - + --------- + ------- +
| SPACE_ID | int(11)unsigned | NO | | | |
| INDEX_ID | bigint(21)unsigned | NO | | | |
| N_CACHED_PAGES | bigint(21)unsigned | 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文檔進行部分更新的二進制日誌記錄。

然而,總體而言,許多功能都可用(您可以在這裡閱讀所有關於它們的信息 ),其中一個(我希望我的客戶明天)是每個通道的複製文件管理器。
我的測試實例已經啟用了二進制日誌,但它們現在默認情況下與基於TABLE和基於文件的主從信息一起使用(默認情況下基於該事務的粉絲)

總的來說,這只是第一眼看到這個版本和對它的非常高層次的想法,還有很多其他的變化。 查看有關此版本的其他博客帖子以及手冊發行說明也將有所幫助。 當然,下載和復審看起來對於管理,安全和復制的觀點非常有希望。

2018年3月14日星期三

MySQL备忘单

因此,我首先发布了,觉得我应该是。 我一直非常忙于使用MySQL和所有相关的分支,并且没有按照我的感觉推出博客。 所以我会努力。 

现在,据说我前几天回忆起一个我曾爱过的网站,因为这是一个常见的VI作弊表单。 你知道的语法,你知道你需要它,但键入它3次,直到它正确。 当它进入正确的时候,你会看到它傻眼,我想我已经写过了。 

所以我想知道为什么不是一个简单的常见MySQL命令列表,我们每个人都要么每个月键入50次,要么应该知道我们的手背,但忘记了当客户端看着我们的肩膀。 
对于初学者.. 
我们建立了一个新的MySQL 5.7.6+服务器并登录.. 
在我们可以做任何事情之前需要更改密码。 但它是Alter用户未设置通过。 
我们想知道如何以明文形式阅读密码。 

改变用户 
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 SECURE客户端 
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个数据库。什么模式有TableA 
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 

SKIP REPLICATION ERROR 
STOP SLAVE; SET GLOBAL sql_slave_skip_counter =1; START SLAVE; SELECT SLEEP(1); SHOW SLAVE STATUS\G 

2017年10月14日星期六

MySQL InnoDB表空間加密

MySQL表空間加密設置相對簡單。 你必須使用MySQL 5.7,innodb_file_per_table 


MySQL文檔涵蓋了您需要設置的所有內容: 


但是如果我剛剛分享了一個鏈接,我的博文將很短。 所以.... 

升級後,在MySQL 5.7中,您需要有一個有效的密鑰文件位置。 我有一個MySQL datadir作為/ var / lib / mysql / data這允許默認的位置為人們找到它,如果需要,但也允許一個簡單的安裝位置為更多的磁盤,如果需要,以及。 這也避免了對selinux等進行其他編輯,因為它已經允許/ var / lib / mysql。 

觸摸/ 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_file.so 
keyring_file_data =的/ var / lib中/ MySQL的/鑰匙圈 

MySQL啟動後檢查您的插件: 

mysql> SELECT PLUGIN_NAME,PLUGIN_STATUS 
- > FROM INFORMATION_SCHEMA.PLUGINS 
- > WHERE PLUGIN_NAME LIKE'keyring%'; 
+ -------------- + --------------- + 
| PLUGIN_NAME | PLUGIN_STATUS | 
+ -------------- + --------------- + 
| keyring_file | ACTIVE | 
| keyring_udf | ACTIVE | 
+ -------------- + --------------- + 


INSTALL PLUGIN keyring_udf SONAME'keyring_udf.so'; 
CREATE FUNCTION keyring_key_generate RETURNS INTEGER SONAME'keyring_udf.so'; 
CREATE FUNCTION keyring_key_fetch RETURNS STRING SONAME'keyring_udf.so'; 
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER SONAME'keyring_udf.so'; 
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING SONAME'keyring_udf.so'; 
CREATE FUNCTION keyring_key_store RETURNS 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> alter table 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秒)