Mysql
 sql >> база данни >  >> RDS >> Mysql

Архивирайте MySQL Amazon RDS

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 за да прочетете binlog на главния в получените от вас координати, като проверите новия си подчинен, за да видите кои от събитията трябва да са вече изпълнени, преди моментната снимка действително да започне, и като използвате координатите, определени по този начин, за CHANGE MASTER TO .

  • използвайте външен процес, за да получите заключване за четене на всяка таблица на сървъра, което ще спре всички записи; обърнете внимание, че позицията на binlog от SHOW MASTER STATUS е спрял да нараства, стартирайте архивирането и освободете тези заключвания.

Ако използвате някой от тези подходи, различен от може би последния, особено важно е да правите сравнения на таблици, за да сте сигурни, че вашият подчинен е идентичен с главния, след като се изпълнява. Ако ударите последващи грешки при репликация... значи не е било.

Вероятно най-безопасният вариант, но и може би най-досадният тъй като изглежда, че не би трябвало да е необходимо - е да започнете със създаване на RDS реплика за четене на вашия RDS master. След като е направен и синхронизиран с главния, можете да спрете репликацията на репликата за четене на 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, след като вашият външен подчинен е стартиран и работи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Средно за count() в същата заявка

  2. ефективен за паметта вграден SqlAlchemy итератор/генератор?

  3. Команден ред за експортиране на XML таблица на Mysql

  4. Как да актуализирате от изберете с Join

  5. MYSQL не добавя информация към моята база данни