Ответ 1
RDS не позволяет даже главному пользователю привилегию SUPER
, и это необходимо для выполнения FLUSH TABLES WITH READ LOCK
. (Это несчастливое ограничение RDS).
Сбой сгенерируется с помощью опции --master-data
, которая, конечно же, необходима, если вы хотите узнать точные координаты binlog, где начинается резервное копирование. FLUSH TABLES WITH READ LOCK
получает глобальную блокировку чтения во всех таблицах, что позволяет mysqldump START TRANSACTION WITH CONSISTENT SNAPSHOT
(как и при использовании --single-transaction
), а затем SHOW MASTER STATUS
для получения координат двоичного журнала, после чего он освобождает глобальную блокировку чтения, потому что она имеет транзакцию, которая сохранит видимые данные в состоянии, соответствующем этой позиции журнала.
RDS нарушает этот механизм, отрицая привилегию SUPER
и не предоставляя очевидного способа обхода.
Есть некоторые хакеры, доступные для правильной работы вокруг этого, ни одна из которых не может быть особенно привлекательной:
-
выполните резервное копирование в течение периода низкого трафика. Если координаты binlog не изменились между временем запуска резервной копии и после того, как резервная копия начала записывать данные на выходной файл или на целевой сервер (при условии, что вы использовали
--single-transaction
), это будет работать, потому что вы знаете, что координаты не менялись пока процесс выполнялся. -
соблюдайте позицию binlog на главном праве перед началом резервного копирования и используйте эти координаты с помощью
CHANGE MASTER TO
. Если ваш мастерbinlog_format
установлен наROW
, тогда это должно сработать, хотя вам, вероятно, придется пропустить несколько первоначальных ошибок, но не должно иметь впоследствии ошибок. Это работает, потому что репликация на основе строк очень детерминирована и остановится, если попытается вставить что-то, что уже есть, или удалить что-то, что уже прошло. Пройдя мимо ошибок, вы будете находиться в истинных координатах binlog, где фактически был создан последовательный моментальный снимок. -
как в предыдущем пункте, но после восстановления резервной копии попытайтесь определить правильную позицию, используя
mysqlbinlog --base64-output=decode-rows --verbose
, чтобы прочитать мастер-бит в полученных координатах, проверив ваше новое ведомое устройство, чтобы узнать, какое из событий должен быть уже выполнен до момента создания моментального снимка и с использованием координат, определенных таким образом, чтобыCHANGE MASTER TO
. -
использовать внешний процесс для получения блокировки чтения для каждой таблицы на сервере, которая остановит все записи; обратите внимание, что позиция binlog из
SHOW MASTER STATUS
перестала увеличиваться, запускать резервную копию и освобождать эти блокировки.
Если вы используете какой-либо из этих подходов, кроме, возможно, последнего, особенно важно, чтобы вы сравнивали таблицы, чтобы ваш ведомый был идентичен мастеру после его запуска. Если вы ударите последующие ошибки репликации... тогда это не так.
Вероятно, самый безопасный вариант - но также, возможно, самый раздражающий, поскольку он не должен быть необходимым, - это начать с создания реплики RDS для чтения вашего RDS-мастера. После того, как он вставлен и синхронизирован с ведущим, вы можете остановить репликацию в реплике RDS, выполнив хранимую процедуру RDS, CALL mysql.rds_stop_replication
которая была введена в RDS 5.6.13 и 5.5.33, который не требует привилегии SUPER
.
Когда ведомое устройство реплики RDS остановлено, возьмите mysqldump
из реплики RDS-чтения, которая теперь будет иметь неизменный набор данных на нем как определенный набор основных координат. Восстановите эту резервную копию на своем подчиненном подчиненном устройстве, а затем используйте основные координаты реплики RDS для чтения от SHOW SLAVE STATUS
Exec_Master_Log_Pos
и Relay_Master_Log_File
в качестве ваших координат CHANGE MASTER TO
.
Значение, показанное в Exec_Master_Log_Pos
на подчиненном устройстве, начало следующей транзакции или события, которое будет обработано, и что именно там, где нужно запустить новое подчиненное устройство чтение на главном сервере.
Затем вы можете вывести из строя реплику RDS-чтения после того, как ваш внешний ведомый будет запущен и запущен.