Users Configuration
Users are configured in table mysql_users
.
Note: Before proceeding reading the following section, please make sure you understand the multi-layer configuration system used by ProxySQL.
Specifically:
- changes in
mysql_users
table do not take effect without runningLOAD MYSQL USERS TO RUNTIME
- changes in
mysql_users
table are lost after a restart/crash if not saved to disk runningSAVE MYSQL USERS TO DISK
All changes in mysql_users
table do not take effect immediately, neither are persistent.
Changes to mysql_users
are to be considered as editing a config file without saving it or reloading the service.
Copying mysql users from memory to runtime
loads MySQL users from the in-memory database to the runtime data structures
Admin> LOAD MYSQL USERS TO RUNTIME;
Other alias accepted:
LOAD MYSQL USERS TO RUN
LOAD MYSQL USERS FROM MEM
LOAD MYSQL USERS FROM MEMORY
Copying mysql users from memory to disk
persists the MySQL users from the in-memory database to the on-disk database
Admin> SAVE MYSQL USERS TO DISK;
Other alias accepted:
SAVE MYSQL USERS FROM MEM
SAVE MYSQL USERS FROM MEMORY
Copying mysql users from runtime to memory
persists the MySQL users from the runtime data structures to the in-memory database
Admin> SAVE MYSQL USERS TO MEMORY;
Other alias accepted:
SAVE MYSQL USERS TO MEM
SAVE MYSQL USERS FROM RUN
SAVE MYSQL USERS FROM RUNTIME
Copying mysql users from disk to memory
loads MySQL users from the on-disk database to the in-memory database
Admin> LOAD MYSQL USERS TO MEMORY;
Other alias accepted:
LOAD MYSQL USERS TO MEM
LOAD MYSQL USERS FROM DISK
Using encrypted passwords
ProxySQL supports hashed passwords, and a detailed description is available here
In the examples below passwords are in clear text. Although this is acceptable for testing, it is not suitable for production. For production you should only use hashed passwords
Creating a new user
In order to create a new user, it must be defined inserting a new row in mysql_users
table.
Note that the table has several column with defaults.
Admin> SELECT * FROM mysql_users;
Empty set (0.00 sec)
Admin> INSERT INTO mysql_users(username,password) VALUES ('user1','password1');
Query OK, 1 row affected (0.00 sec)
Admin> SELECT * FROM mysql_users\G
*************************** 1. row ***************************
username: user1
password: password1
active: 1
use_ssl: 0
default_hostgroup: 0
default_schema: NULL
schema_locked: 0
transaction_persistent: 1
fast_forward: 0
backend: 1
frontend: 1
max_connections: 10000
comment:
1 row in set (0.00 sec)
Create a new user changing several defaults
In this example we will create a new user that:
- uses
dbtest1
as default schema - by default will be connected to a host in hostgroup 10
Admin> INSERT INTO mysql_users(username,password,default_hostgroup,default_schema) VALUES ('user2','password2',10,'dbtest1'); Query OK, 1 row affected (0.00 sec)
Limiting the number of connections a user can create to proxysql
An example:
Admin> SELECT username,max_connections FROM mysql_users;
+----------+-----------------+
| username | max_connections |
+----------+-----------------+
| user1 | 10000 |
| user2 | 10000 |
+----------+-----------------+
2 rows in set (0.00 sec)
Admin> UPDATE mysql_users SET max_connections=100 WHERE username='user2';
Query OK, 1 row affected (0.01 sec)
Admin> SELECT username,max_connections FROM mysql_users;
+----------+-----------------+
| username | max_connections |
+----------+-----------------+
| user1 | 10000 |
| user2 | 100 |
+----------+-----------------+
2 rows in set (0.00 sec)
Disabling routing across hostgroups once a transaction has started for a specific user
Once a transaction is started, it is possible that some queries are sent to a different hostgroup based on query rules.
To prevent this to happen, it is possible to enable transaction_persistent
. An example:
Admin> SELECT username, transaction_persistent FROM mysql_users;
+----------+------------------------+
| username | transaction_persistent |
+----------+------------------------+
| user1 | 0 |
| user2 | 0 |
+----------+------------------------+
2 rows in set (0.00 sec)
Admin> UPDATE mysql_users SET transaction_persistent=1 WHERE username='user2';
Query OK, 1 row affected (0.00 sec)
Admin> SELECT username, transaction_persistent FROM mysql_users;
+----------+------------------------+
| username | transaction_persistent |
+----------+------------------------+
| user1 | 0 |
| user2 | 1 |
+----------+------------------------+
2 rows in set (0.00 sec)