ProxySQL uses a three-tier configuration model: DISK ↔ MEMORY ↔ RUNTIME.
The MYSQLX plugin previously only supported the MEMORY ↔ RUNTIME tier
(LOAD MYSQLX USERS TO RUNTIME, SAVE MYSQLX USERS TO MEMORY, etc.).
Configuration was lost on restart because there was no way to persist
it to disk.
Add the missing DISK ↔ MEMORY tier commands for all four MYSQLX object
types:
LOAD MYSQLX USERS FROM DISK (disk → memory)
SAVE MYSQLX USERS TO DISK (memory → disk)
LOAD MYSQLX ROUTES FROM DISK
SAVE MYSQLX ROUTES TO DISK
LOAD MYSQLX BACKEND ENDPOINTS FROM DISK
SAVE MYSQLX BACKEND ENDPOINTS TO DISK
LOAD MYSQLX VARIABLES FROM DISK
SAVE MYSQLX VARIABLES TO DISK
Implementation:
- Add disk_to_memory() and memory_to_disk() helpers in
mysqlx_admin_schema.cpp that use qualified SQLite table names
(main.<table> and disk.<table>) to copy between the in-memory
admin database and the on-disk config database
- Register 8 new command handlers in mysqlx_register_admin_schema()
- Add alias vectors for all disk commands in Admin_Handler.cpp
- Add resolve_admin_alias_to_canonical() calls for disk commands in
the MYSQLX dispatch block
Tested: Insert → SAVE TO DISK → DELETE → LOAD FROM DISK round-trip
confirms data persistence works for all four object types.
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_BACKEND_ENDPOINTS_TO_MEMORY,"SAVE MYSQLX BACKEND ENDPOINTS TO MEMORY",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(LOAD_MYSQLX_VARIABLES_FROM_MEMORY,"LOAD MYSQLX VARIABLES TO RUNTIME",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_VARIABLES_TO_MEMORY,"SAVE MYSQLX VARIABLES TO MEMORY",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(LOAD_MYSQLX_USERS_FROM_DISK,"LOAD MYSQLX USERS FROM DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_USERS_TO_DISK,"SAVE MYSQLX USERS TO DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(LOAD_MYSQLX_ROUTES_FROM_DISK,"LOAD MYSQLX ROUTES FROM DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_ROUTES_TO_DISK,"SAVE MYSQLX ROUTES TO DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(LOAD_MYSQLX_BACKEND_ENDPOINTS_FROM_DISK,"LOAD MYSQLX BACKEND ENDPOINTS FROM DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_BACKEND_ENDPOINTS_TO_DISK,"SAVE MYSQLX BACKEND ENDPOINTS TO DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(LOAD_MYSQLX_VARIABLES_FROM_DISK,"LOAD MYSQLX VARIABLES FROM DISK",query_no_space,query_no_space_length);
if(!mysqlx_canonical)mysqlx_canonical=resolve_admin_alias_to_canonical(SAVE_MYSQLX_VARIABLES_TO_DISK,"SAVE MYSQLX VARIABLES TO DISK",query_no_space,query_no_space_length);