259 lines
9.6 KiB
SQL
259 lines
9.6 KiB
SQL
-- Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
--
|
|
-- This program is free software; you can redistribute it and/or modify
|
|
-- it under the terms of the GNU General Public License as published by
|
|
-- the Free Software Foundation; version 2 of the License.
|
|
--
|
|
-- This program is distributed in the hope that it will be useful,
|
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
-- GNU General Public License for more details.
|
|
--
|
|
-- You should have received a copy of the GNU General Public License
|
|
-- along with this program; if not, write to the Free Software
|
|
-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
delimiter |
|
|
|
|
drop function if exists mysql.mysql_cluster_privileges_are_distributed|
|
|
drop procedure if exists mysql.mysql_cluster_backup_privileges|
|
|
drop procedure if exists mysql.mysql_cluster_move_grant_tables|
|
|
drop procedure if exists mysql.mysql_cluster_restore_privileges_from_local|
|
|
drop procedure if exists mysql.mysql_cluster_restore_privileges|
|
|
drop procedure if exists mysql.mysql_cluster_restore_local_privileges|
|
|
drop procedure if exists mysql.mysql_cluster_move_privileges|
|
|
|
|
-- Count number of privilege tables in NDB, require
|
|
-- all the tables to be in NDB in order to return "true"
|
|
create function mysql.mysql_cluster_privileges_are_distributed()
|
|
returns bool
|
|
reads sql data
|
|
begin
|
|
declare distributed bool default 0;
|
|
|
|
select COUNT(table_name) = 6
|
|
into distributed
|
|
from information_schema.tables
|
|
where table_schema = "mysql" and
|
|
table_name IN ("user", "db", "tables_priv",
|
|
"columns_priv", "procs_priv",
|
|
"proxies_priv") and
|
|
table_type = 'BASE TABLE' and
|
|
engine = 'NDBCLUSTER';
|
|
|
|
return distributed;
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_backup_privileges()
|
|
begin
|
|
declare distributed_privileges bool default 0;
|
|
declare first_backup bool default 1;
|
|
declare first_distributed_backup bool default 1;
|
|
select mysql.mysql_cluster_privileges_are_distributed()
|
|
into distributed_privileges;
|
|
select 0 into first_backup
|
|
from information_schema.tables
|
|
where table_schema = "mysql" and table_name = "user_backup";
|
|
select 0 into first_distributed_backup
|
|
from information_schema.tables
|
|
where table_schema = "mysql" and table_name = "ndb_user_backup";
|
|
if first_backup = 1 then
|
|
create table if not exists mysql.user_backup
|
|
like mysql.user;
|
|
create table if not exists mysql.db_backup
|
|
like mysql.db;
|
|
create table if not exists mysql.tables_priv_backup
|
|
like mysql.tables_priv;
|
|
create table if not exists mysql.columns_priv_backup
|
|
like mysql.columns_priv;
|
|
create table if not exists mysql.procs_priv_backup
|
|
like mysql.procs_priv;
|
|
create table if not exists mysql.proxies_priv_backup
|
|
like mysql.proxies_priv;
|
|
if distributed_privileges = 1 then
|
|
alter table mysql.user_backup engine = myisam;
|
|
alter table mysql.db_backup engine = myisam;
|
|
alter table mysql.tables_priv_backup engine = myisam;
|
|
alter table mysql.columns_priv_backup engine = myisam;
|
|
alter table mysql.procs_priv_backup engine = myisam;
|
|
alter table mysql.proxies_priv_backup engine = myisam;
|
|
end if;
|
|
else
|
|
truncate mysql.user_backup;
|
|
truncate mysql.db_backup;
|
|
truncate mysql.tables_priv_backup;
|
|
truncate mysql.columns_priv_backup;
|
|
truncate mysql.procs_priv_backup;
|
|
truncate mysql.proxies_priv_backup;
|
|
end if;
|
|
if first_distributed_backup = 1 then
|
|
create table if not exists mysql.ndb_user_backup
|
|
like mysql.user;
|
|
create table if not exists mysql.ndb_db_backup
|
|
like mysql.db;
|
|
create table if not exists mysql.ndb_tables_priv_backup
|
|
like mysql.tables_priv;
|
|
create table if not exists mysql.ndb_columns_priv_backup
|
|
like mysql.columns_priv;
|
|
create table if not exists mysql.ndb_procs_priv_backup
|
|
like mysql.procs_priv;
|
|
create table if not exists mysql.ndb_proxies_priv_backup
|
|
like mysql.proxies_priv;
|
|
|
|
if distributed_privileges = 0 then
|
|
alter table mysql.ndb_user_backup engine = ndbcluster;
|
|
alter table mysql.ndb_db_backup engine = ndbcluster;
|
|
alter table mysql.ndb_tables_priv_backup engine = ndbcluster;
|
|
alter table mysql.ndb_columns_priv_backup engine = ndbcluster;
|
|
alter table mysql.ndb_procs_priv_backup engine = ndbcluster;
|
|
alter table mysql.ndb_proxies_priv_backup engine = ndbcluster;
|
|
end if;
|
|
else
|
|
truncate mysql.ndb_user_backup;
|
|
truncate mysql.ndb_db_backup;
|
|
truncate mysql.ndb_tables_priv_backup;
|
|
truncate mysql.ndb_columns_priv_backup;
|
|
truncate mysql.ndb_procs_priv_backup;
|
|
truncate mysql.ndb_proxies_priv_backup;
|
|
end if;
|
|
insert into mysql.user_backup select * from mysql.user;
|
|
insert into mysql.db_backup select * from mysql.db;
|
|
insert into mysql.tables_priv_backup select * from mysql.tables_priv;
|
|
insert into mysql.columns_priv_backup select * from mysql.columns_priv;
|
|
insert into mysql.procs_priv_backup select * from mysql.procs_priv;
|
|
insert into mysql.proxies_priv_backup select * from mysql.proxies_priv;
|
|
|
|
insert into mysql.ndb_user_backup select * from mysql.user;
|
|
insert into mysql.ndb_db_backup select * from mysql.db;
|
|
insert into mysql.ndb_tables_priv_backup select * from mysql.tables_priv;
|
|
insert into mysql.ndb_columns_priv_backup select * from mysql.columns_priv;
|
|
insert into mysql.ndb_procs_priv_backup select * from mysql.procs_priv;
|
|
insert into mysql.ndb_proxies_priv_backup select * from mysql.proxies_priv;
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_restore_privileges_from_local()
|
|
begin
|
|
declare local_backup bool default 0;
|
|
select 1 into local_backup
|
|
from information_schema.tables
|
|
where table_schema = "mysql" and table_name = "user_backup";
|
|
if local_backup = 1 then
|
|
create table if not exists mysql.user
|
|
like mysql.user_backup;
|
|
create table if not exists mysql.db
|
|
like mysql.db_backup;
|
|
create table if not exists mysql.tables_priv
|
|
like mysql.tables_priv_backup;
|
|
create table if not exists mysql.columns_priv
|
|
like mysql.columns_priv_backup;
|
|
create table if not exists mysql.procs_priv
|
|
like mysql.procs_priv_backup;
|
|
create table if not exists mysql.proxies_priv
|
|
like mysql.proxies_priv_backup;
|
|
delete from mysql.user;
|
|
insert into mysql.user select * from mysql.user_backup;
|
|
delete from mysql.db;
|
|
insert into mysql.db select * from mysql.db_backup;
|
|
delete from mysql.tables_priv;
|
|
insert into mysql.tables_priv select * from mysql.tables_priv_backup;
|
|
delete from mysql.columns_priv;
|
|
insert into mysql.columns_priv select * from mysql.columns_priv_backup;
|
|
delete from mysql.procs_priv;
|
|
insert into mysql.procs_priv select * from mysql.procs_priv_backup;
|
|
delete from mysql.proxies_priv;
|
|
insert into mysql.proxies_priv select * from mysql.proxies_priv_backup;
|
|
end if;
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_restore_privileges()
|
|
begin
|
|
declare distributed_backup bool default 0;
|
|
select 1 into distributed_backup
|
|
from information_schema.tables
|
|
where table_schema = "mysql" and table_name = "ndb_user_backup";
|
|
if distributed_backup = 1 then
|
|
flush tables;
|
|
create table if not exists mysql.user
|
|
like mysql.ndb_user_backup;
|
|
create table if not exists mysql.db
|
|
like mysql.ndb_db_backup;
|
|
create table if not exists mysql.tables_priv
|
|
like mysql.ndb_tables_priv_backup;
|
|
create table if not exists mysql.columns_priv
|
|
like mysql.ndb_columns_priv_backup;
|
|
create table if not exists mysql.procs_priv
|
|
like mysql.ndb_procs_priv_backup;
|
|
create table if not exists mysql.proxies_priv
|
|
like mysql.ndb_proxies_priv_backup;
|
|
delete from mysql.user;
|
|
insert into mysql.user
|
|
select * from mysql.ndb_user_backup;
|
|
delete from mysql.db;
|
|
insert into mysql.db
|
|
select * from mysql.ndb_db_backup;
|
|
delete from mysql.tables_priv;
|
|
insert into mysql.tables_priv
|
|
select * from mysql.ndb_tables_priv_backup;
|
|
delete from mysql.columns_priv;
|
|
insert into mysql.columns_priv
|
|
select * from mysql.ndb_columns_priv_backup;
|
|
delete from mysql.procs_priv;
|
|
insert into mysql.procs_priv
|
|
select * from mysql.ndb_procs_priv_backup;
|
|
delete from mysql.proxies_priv;
|
|
insert into mysql.proxies_priv
|
|
select * from mysql.ndb_proxies_priv_backup;
|
|
else
|
|
call mysql_cluster_restore_privileges_from_local();
|
|
end if;
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_restore_local_privileges()
|
|
begin
|
|
declare distributed_privileges bool default 0;
|
|
select mysql.mysql_cluster_privileges_are_distributed()
|
|
into distributed_privileges;
|
|
if distributed_privileges = 1 then
|
|
begin
|
|
drop table mysql.user;
|
|
drop table mysql.db;
|
|
drop table mysql.tables_priv;
|
|
drop table mysql.columns_priv;
|
|
drop table mysql.procs_priv;
|
|
drop table mysql.proxies_priv;
|
|
end;
|
|
end if;
|
|
call mysql_cluster_restore_privileges_from_local();
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_move_grant_tables()
|
|
begin
|
|
declare distributed_privileges bool default 0;
|
|
declare revert bool default 0;
|
|
select mysql.mysql_cluster_privileges_are_distributed()
|
|
into distributed_privileges;
|
|
if distributed_privileges = 0 then
|
|
begin
|
|
declare exit handler for sqlexception set revert = 1;
|
|
alter table mysql.user engine = ndb;
|
|
alter table mysql.db engine = ndb;
|
|
alter table mysql.tables_priv engine = ndb;
|
|
alter table mysql.columns_priv engine = ndb;
|
|
alter table mysql.procs_priv engine = ndb;
|
|
alter table mysql.proxies_priv engine = ndb;
|
|
end;
|
|
end if;
|
|
if revert = 1 then
|
|
call mysql_cluster_restore_privileges();
|
|
end if;
|
|
end|
|
|
|
|
create procedure mysql.mysql_cluster_move_privileges()
|
|
begin
|
|
call mysql_cluster_backup_privileges();
|
|
call mysql_cluster_move_grant_tables();
|
|
end|
|
|
|
|
delimiter ;
|
|
|