mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
MDEV-9931 introduced a counter for keeping track of reads of the first page of InnoDB data files, because the original implementation of data-at-rest-encryption for InnoDB introduced new code paths for reading the pages. Ultimately, the extra reads of the first page were removed, and the encryption subsystem will be initialized whenever we first read the first page of each data file, in fil_node_open_file(). It should not be that interesting to observe how many times an InnoDB data file was opened for the first time.
208 lines
5.6 KiB
Plaintext
208 lines
5.6 KiB
Plaintext
-- source include/have_innodb.inc
|
|
-- source include/have_example_key_management_plugin.inc
|
|
-- source include/big_test.inc
|
|
|
|
# embedded does not support restart
|
|
-- source include/not_embedded.inc
|
|
|
|
--disable_query_log
|
|
let $innodb_encryption_threads_orig = `SELECT @@global.innodb_encryption_threads`;
|
|
--enable_query_log
|
|
|
|
# empty the change buffer and the undo logs to avoid extra reads
|
|
SET GLOBAL innodb_fast_shutdown=0;
|
|
--source include/restart_mysqld.inc
|
|
|
|
SHOW VARIABLES LIKE 'innodb_encrypt%';
|
|
|
|
#
|
|
# This will create 100 tables where that could be
|
|
# encrypted an unencrypt
|
|
#
|
|
create database innodb_encrypted_1;
|
|
use innodb_encrypted_1;
|
|
set autocommit=0;
|
|
let $tables = 100;
|
|
|
|
--disable_query_log
|
|
while ($tables)
|
|
{
|
|
eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
|
|
stats_persistent=0;
|
|
commit;
|
|
let $rows = 100;
|
|
while($rows)
|
|
{
|
|
eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
|
|
dec $rows;
|
|
}
|
|
commit;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
|
|
set autocommit=1;
|
|
commit work;
|
|
#
|
|
# Verify
|
|
#
|
|
--echo # should be empty
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%';
|
|
|
|
#
|
|
# This will create 100 tables that are encrypted always
|
|
#
|
|
create database innodb_encrypted_2;
|
|
use innodb_encrypted_2;
|
|
set autocommit=0;
|
|
|
|
--disable_query_log
|
|
let $tables = 100;
|
|
while ($tables)
|
|
{
|
|
eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
|
|
stats_persistent=0 encrypted=yes;
|
|
commit;
|
|
let $rows = 100;
|
|
while($rows)
|
|
{
|
|
eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
|
|
dec $rows;
|
|
}
|
|
commit;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
|
|
commit work;
|
|
set autocommit=1;
|
|
#
|
|
# Verify
|
|
#
|
|
--echo # should contain 100 tables
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
--echo # should contain 0 tables
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
#
|
|
# This will create 100 tables that are not encrypted
|
|
#
|
|
create database innodb_encrypted_3;
|
|
use innodb_encrypted_3;
|
|
set autocommit=0;
|
|
|
|
--disable_query_log
|
|
let $tables = 100;
|
|
while ($tables)
|
|
{
|
|
eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
|
|
stats_persistent=0 encrypted=no;
|
|
commit;
|
|
let $rows = 100;
|
|
while($rows)
|
|
{
|
|
eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
|
|
dec $rows;
|
|
}
|
|
commit;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
|
|
commit work;
|
|
set autocommit=1;
|
|
#
|
|
# Verify
|
|
#
|
|
--echo # should contain 100 tables
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
--echo # should contain 100 tables
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
use test;
|
|
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
SET GLOBAL innodb_encrypt_tables = on;
|
|
SET GLOBAL innodb_encryption_threads=4;
|
|
|
|
--let $wait_timeout= 600
|
|
--let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
|
--source include/wait_condition.inc
|
|
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
--echo # Success!
|
|
--echo # Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0
|
|
-- let $restart_parameters=--innodb_encrypt_tables=0 --innodb_encryption_threads=0
|
|
-- source include/restart_mysqld.inc
|
|
|
|
--echo # Restart Success!
|
|
|
|
use innodb_encrypted_1;
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
let $tables = 100;
|
|
while ($tables)
|
|
{
|
|
eval select * from t_$tables;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
--enable_result_log
|
|
|
|
use innodb_encrypted_2;
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
let $tables = 100;
|
|
while ($tables)
|
|
{
|
|
eval select * from t_$tables;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
--enable_result_log
|
|
|
|
use innodb_encrypted_3;
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
let $tables = 100;
|
|
while ($tables)
|
|
{
|
|
eval select * from t_$tables;
|
|
dec $tables;
|
|
}
|
|
--enable_query_log
|
|
--enable_result_log
|
|
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
SET GLOBAL innodb_encrypt_tables = off;
|
|
SET GLOBAL innodb_encryption_threads=4;
|
|
|
|
--let $wait_timeout= 600
|
|
--let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
|
|
--source include/wait_condition.inc
|
|
|
|
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
|
|
|
|
#
|
|
# Cleanup
|
|
#
|
|
use test;
|
|
drop database innodb_encrypted_1;
|
|
drop database innodb_encrypted_2;
|
|
drop database innodb_encrypted_3;
|
|
|
|
--disable_query_log
|
|
EVAL SET GLOBAL innodb_encryption_threads = $innodb_encryption_threads_orig;
|
|
--enable_query_log
|