Description:
Since 8.0 when MySQL native cloning has been possible we are able to clone from one server to another without taking the source server down. This facility is good and very convenient.
Native cloning has some limitations as mentioned here: https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-limitations.html
One is: The clone plugin only clones data stored in InnoDB. Other storage engine data is not cloned. MyISAM and CSV tables stored in any schema including the sys schema are cloned as empty tables.
This seems to mean that you can "successfully clone" data between servers without error yet lose any data in a MyISAM table. That's terribly horrible and unsafe and if not expected could be very dangerous.
To prevent this there is a setting to disable the use of specific storage engines
using the disabled_storage_engines variable.
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_disabled_stora... indicates that this setting is not dynamic.
This becomes more critical now as we may want to prevent any non-InnoDB tables being created accidentally as native cloning will copy definitions but silently lose the data, something which I think it should not do.
Yet to enable this setting you need to restart mysqld which on a master is not good.
How to repeat:
Try to change the running configuration and see it is not dynamic.
root@host [(none)]> select @@version;
+------------+
| @@version |
+------------+
| 8.0.23 |
+------------+
1 row in set (0.00 sec)
root@host [(none)]> set global disabled_storage_engines=MyISAM;
ERROR 1238 (HY000): Variable 'disabled_storage_engines' is a read only variable
Suggested fix:
Make this setting dynamic so that I can set it on systems using native cloning without restarting them to prevent potential loss of data on non-InnoDB tables.