sql >> Database >  >> RDS >> MariaDB

Hoe MySQL-back-ups voor Oracle DBA's uit te voeren en te beheren

Migreren van Oracle-database naar open source kan een aantal voordelen met zich meebrengen. De lagere eigendomskosten zijn verleidelijk en zetten veel bedrijven ertoe aan om te migreren. Tegelijkertijd moeten DevOps, SysOps of DBA's zich aan strakke SLA's houden om aan zakelijke behoeften te voldoen.

Een van de belangrijkste zorgen bij het plannen van gegevensmigratie naar een andere database, met name open source, is hoe u gegevensverlies kunt voorkomen. Het is niet zo vergezocht dat iemand per ongeluk een deel van de database heeft verwijderd, iemand is vergeten een WHERE-clausule in een DELETE-query op te nemen of DROP TABLE per ongeluk heeft uitgevoerd. De vraag is hoe je van dergelijke situaties kunt herstellen.

Dat soort dingen kunnen en zullen gebeuren, het is onvermijdelijk maar de impact kan rampzalig zijn. Zoals iemand zei:"Het is allemaal leuk en leuk totdat de back-up mislukt". Het meest waardevolle bezit mag niet worden aangetast. Periode.

De angst voor het onbekende is natuurlijk als je niet bekend bent met nieuwe technologie. De kennis van Oracle-databaseoplossingen, betrouwbaarheid en geweldige functies die Oracle Recovery Manager (RMAN) biedt, kan u of uw team zelfs ontmoedigen om naar een nieuw databasesysteem te migreren. We gebruiken graag dingen die we weten, dus waarom migreren als onze huidige oplossing werkt. Wie weet hoeveel projecten in de wacht zijn gezet omdat het team of individu niet overtuigd was van de nieuwe technologie?

Logische back-ups (exp/imp, expdp/impdb)

Volgens MySQL-documentatie is logische back-up "een back-up die de tabelstructuur en gegevens reproduceert, zonder de daadwerkelijke gegevensbestanden te kopiëren." Deze definitie kan van toepassing zijn op zowel MySQL- als Oracle-werelden. Hetzelfde geldt voor "waarom" en "wanneer" u de logische back-up gebruikt.

Logische back-ups zijn een goede optie als we weten welke gegevens worden gewijzigd, zodat u alleen een back-up kunt maken van het onderdeel dat u nodig hebt. Het vereenvoudigt potentieel herstel in termen van tijd en complexiteit. Het is ook erg handig als we een deel van een kleine/middelgrote dataset moeten verplaatsen en terug moeten kopiëren naar een ander systeem (vaak op een andere databaseversie). Oracle gebruikt exporthulpprogramma's zoals exp en expdp om databasegegevens te lezen en deze vervolgens te exporteren naar een bestand op besturingssysteemniveau. U kunt de gegevens vervolgens weer in een database importeren met behulp van de importprogramma's imp of impdp.

De Oracle Export Utilities geeft ons veel opties om te kiezen welke gegevens geëxporteerd moeten worden. Je zult zeker niet hetzelfde aantal functies vinden met mysql, maar de meeste behoeften zijn gedekt en de rest kan worden gedaan met extra scripting of externe tools (check mydumper).

MySQL wordt geleverd met een pakket tools die zeer basisfunctionaliteit bieden. Dit zijn mysqldump, mysqlpump (de moderne versie van mysqldump met native ondersteuning voor parallellisatie) en MySQL-client die kunnen worden gebruikt om gegevens naar een plat bestand te extraheren.

Hieronder vindt u verschillende voorbeelden van hoe u ze kunt gebruiken:

Alleen back-updatabasestructuur

mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql

Back-up tabelstructuur

mysqldump --no-data --single- transaction -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql

Back-up van specifieke rijen

mysqldump -h localhost --single- transaction -u root -ppassword mydatabase table_name --where="date_created='2019-05-07'" > table_with_specific_rows_dump.sql

De tabel importeren

mysql -u username -p -D dbname < tableName.sql

De bovenstaande opdracht stopt met laden als er een fout optreedt.

Als u gegevens rechtstreeks vanuit de mysql-client laadt, worden de fouten genegeerd en gaat de client verder

mysql> source tableName.sql

Om output te loggen, moet u

mysql> tee import_tableName.log

U kunt alle vlaggen vinden die worden uitgelegd onder onderstaande links:

  • https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
  • https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html
  • https://dev.mysql.com/doc/refman/8.0/en/mysql.html

Als u van plan bent om logische back-up te gebruiken voor verschillende databaseversies, zorg er dan voor dat u de juiste sorteerinstellingen hebt. De volgende instructie kan worden gebruikt om de standaard tekenset en sortering voor een bepaalde database te controleren:

USE mydatabase;
SELECT @@character_set_database, @@collation_database;

Een andere manier om de systeemvariabele collation_database op te halen is door de SHOW VARIABLES te gebruiken.

SHOW VARIABLES LIKE 'collation%';

Vanwege de beperkingen van de mysql-dump moeten we vaak de uitvoer aanpassen. Een voorbeeld van een dergelijke wijziging kan de noodzaak zijn om enkele regels te verwijderen. Gelukkig hebben we de flexibiliteit om de uitvoer te bekijken en aan te passen met behulp van standaard teksthulpmiddelen voordat we ze terugzetten. Tools zoals awk, grep, sed kunnen je vriend worden. Hieronder ziet u een eenvoudig voorbeeld van hoe u de derde regel uit het dumpbestand kunt verwijderen.

sed -i '1,3d' file.txt

De mogelijkheden zijn eindeloos. Dit is iets dat we bij Oracle niet zullen vinden, aangezien gegevens in binair formaat worden geschreven.

Er zijn een paar dingen waar u rekening mee moet houden wanneer u logische mysql uitvoert. Een van de belangrijkste beperkingen is de pure ondersteuning van parallellisme en de objectvergrendeling.

Logische back-upoverwegingen

Wanneer een dergelijke back-up wordt uitgevoerd, worden de volgende stappen uitgevoerd.

  • LOCK TABLE-tabel.
  • TOON tabel MAKEN TABEL.
  • SELECT * FROM tabel INTO OUTFILE tijdelijk bestand.
  • Schrijf de inhoud van het tijdelijke bestand aan het einde van het dumpbestand.
  • ONTGRENDELD TABELLEN

Standaard bevat mysqldump geen routines en gebeurtenissen in de uitvoer - u moet expliciet --routines en --events vlaggen instellen.

Een andere belangrijke overweging is een engine die u gebruikt om uw gegevens op te slaan. Hopelijk gebruiken de meeste productiesystemen tegenwoordig ACID-compatibele engine genaamd InnoDB. Oudere engine MyISAM moest alle tabellen vergrendelen om consistentie te garanderen. Dit is wanneer FLUSH TABLES WITH READ LOCK werd uitgevoerd. Helaas is dit de enige manier om een ​​consistente momentopname van MyISAM-tabellen te garanderen terwijl de MySQL-server draait. Hierdoor wordt de MySQL-server alleen-lezen totdat UNLOCK TABLES wordt uitgevoerd.

Voor tabellen op de InnoDB-opslagengine wordt aanbevolen om de optie --single- transaction te gebruiken. MySQL produceert vervolgens een controlepunt waarmee de dump alle gegevens voorafgaand aan het controlepunt kan vastleggen terwijl binnenkomende wijzigingen worden ontvangen.

De optie --single-transactie van mysqldump doet geen FLUSH TABLES MET READ LOCK. Het zorgt ervoor dat mysqldump een REPEATABLE READ-transactie instelt voor alle tabellen die worden gedumpt.

Een mysqldump-back-up is veel langzamer dan Oracle-tools exp, expdp. Mysqldump is een tool met één thread en dit is het belangrijkste nadeel:de prestaties zijn oké voor kleine databases, maar het wordt al snel onaanvaardbaar als de dataset groeit tot tientallen gigabytes.

  • START TRANSACTIE MET CONSISTENTE MOMENTOPNAME.
  • Voor elk databaseschema en elke tabel voert een dump de volgende stappen uit:
    • TOON tabel MAKEN TABEL.
    • SELECT * FROM tabel INTO OUTFILE tijdelijk bestand.
    • Schrijf de inhoud van het tijdelijke bestand aan het einde van het dumpbestand.
  • COMMIT.

Fysieke back-ups (RMAN)

Gelukkig kunnen de meeste beperkingen van logische back-up worden opgelost met de Percona Xtrabackup-tool. Percona XtraBackup is de meest populaire, open source MySQL/MariaDB hot back-upsoftware die niet-blokkerende back-ups uitvoert voor InnoDB- en XtraDB-databases. Het valt in de categorie fysieke back-ups, die bestaat uit exacte kopieën van de MySQL-gegevensmap en de bestanden eronder.

Het is dezelfde categorie tools als Oracle RMAN. RMAN wordt geleverd als onderdeel van de databasesoftware, XtraBackup moet apart worden gedownload. Xtrabackup is beschikbaar als rpm- en deb-pakket en ondersteunt alleen Linux-platforms. De installatie is heel eenvoudig:

$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm
$ yum localinstall percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm

XtraBackup vergrendelt uw database niet tijdens het back-upproces. Voor grote databases (100+ GB) biedt het een veel betere hersteltijd in vergelijking met mysqldump. Het herstelproces omvat het voorbereiden van MySQL-gegevens uit de back-upbestanden, voordat deze worden vervangen of vervangen door de huidige gegevensmap op het doelknooppunt.

Percona XtraBackup werkt door het logvolgnummer (LSN) te onthouden wanneer het wordt gestart en de gegevensbestanden vervolgens naar een andere locatie te kopiëren. Het kopiëren van gegevens kost enige tijd en als de bestanden veranderen, weerspiegelen ze de toestand van de database op verschillende tijdstippen. Tegelijkertijd voert XtraBackup een achtergrondproces uit dat de transactielogboekbestanden (ook wel redo-logbestanden genoemd) in de gaten houdt en wijzigingen daaruit kopieert. Dit moet continu worden gedaan omdat de transactielogboeken op een round-robin-manier worden geschreven en na een tijdje opnieuw kunnen worden gebruikt. XtraBackup heeft de transactielogboekrecords nodig voor elke wijziging in de gegevensbestanden sinds de uitvoering ervan begon.

Wanneer XtraBackup is geïnstalleerd, kunt u eindelijk uw eerste fysieke back-ups maken.

xtrabackup --user=root --password=PASSWORD --backup --target-dir=/u01/backups/

Een andere handige optie die MySQL-beheerders doen, is het streamen van back-ups naar een andere server. Een dergelijke stream kan worden uitgevoerd met behulp van de xbstream-tool, zoals in het onderstaande voorbeeld:

Start een listener op de externe server op de voorkeurspoort (in dit voorbeeld 1984)

nc -l 1984 | pigz -cd - | pv | xbstream -x -C /u01/backups

Back-up uitvoeren en overbrengen naar een externe host

innobackupex --user=root --password=PASSWORD --stream=xbstream /var/tmp | pigz  | pv | nc external_host.com 1984

Zoals u wellicht opmerkt, is het herstelproces verdeeld in twee hoofdstappen (vergelijkbaar met Oracle). De stappen worden hersteld (terug kopiëren) en herstel (log toepassen).

XtraBackup --copy-back --target-dir=/var/lib/data
innobackupex --apply-log --use-memory=[values in MB or GB] /var/lib/data

Het verschil is dat we alleen herstel kunnen uitvoeren tot het punt waarop de back-up is gemaakt. Om wijzigingen na de back-up toe te passen, moeten we dit handmatig doen.

Tijdsherstel herstellen (RMAN-herstel)

In Oracle voert RMAN alle stappen uit wanneer we de database herstellen. Het kan worden gedaan naar SCN of tijd of op basis van de back-upgegevensset.

RMAN> run
{
allocate channel dev1 type disk;
set until time "to_date('2019-05-07:00:00:00', 'yyyy-mm-dd:hh24:mi:ss')";
restore database;
recover database; }

In mysql hebben we een ander hulpmiddel nodig om gegevens te extraheren uit binaire logbestanden (vergelijkbaar met de archieflogs van Oracle) mysqlbinlog. mysqlbinlog kan de binaire logs lezen en converteren naar bestanden. Wat we moeten doen is

De basisprocedure zou zijn

  • Volledige back-up herstellen
  • Herstel incrementele back-ups
  • Om de start- en eindtijden voor herstel te identificeren (dat kan het einde van de back-up zijn en het positienummer voordat de tafel helaas wordt verwijderd).
  • Converteer de benodigde binglogs naar SQL en pas nieuw gemaakte SQL-bestanden in de juiste volgorde toe - zorg ervoor dat u een enkele mysqlbinlog-opdracht uitvoert.
    > mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

Back-ups versleutelen (Oracle Wallet)

Percona XtraBackup kan worden gebruikt om lokale of streaming-back-ups te versleutelen of te ontsleutelen met de xbstream-optie om een ​​extra beveiligingslaag aan de back-ups toe te voegen. Zowel de optie --encrypt-key als --encryptkey-file kunnen worden gebruikt om de encryptiesleutel op te geven. Versleutelingssleutels kunnen worden gegenereerd met opdrachten zoals

$ openssl rand -base64 24
$ bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1

Deze waarde kan vervolgens worden gebruikt als de coderingssleutel. Voorbeeld van het innobackupex-commando met de --encrypt-key:

$ innobackupex --encrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1” /storage/backups/encrypted

Om te ontsleutelen, gebruik je gewoon de --decrypt optie met de juiste --encrypt-key:

$ innobackupex --decrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1”
/storage/backups/encrypted/2019-05-08_11-10-09/

Back-upbeleid

Er is geen ingebouwde back-upbeleidsfunctionaliteit in MySQL/MariaDB of zelfs de tool van Percona. Als u uw MySQL logische of fysieke back-ups wilt beheren, kunt u daarvoor ClusterControl gebruiken.

ClusterControl is het allesomvattende open source databasebeheersysteem voor gebruikers met gemengde omgevingen. Het biedt geavanceerde functionaliteit voor back-upbeheer voor MySQL of MariaDB.

Met ClusterControl kunt u:

  • Maak back-upbeleid
  • Bewaak de back-upstatus, uitvoeringen en servers zonder back-ups
  • Voer back-ups en herstel uit (inclusief herstel op een bepaald tijdstip)
  • Beheer het bewaren van back-ups
  • Back-ups opslaan in cloudopslag
  • Back-ups valideren (volledige test met het herstel op de zelfstandige server)
  • Back-ups coderen
  • Back-ups comprimeren
  • En vele anderen
ClusterControl:back-upbeheer

Bewaar back-ups in de cloud

Organisaties hebben van oudsher tape-back-upoplossingen ingezet als middel om
gegevens te beschermen tegen storingen. De opkomst van public cloud computing heeft echter ook nieuwe modellen mogelijk gemaakt met een lagere TCO dan traditioneel beschikbaar was. Het heeft geen zin om de kosten van een DR-oplossing af te leiden van het ontwerp ervan, dus organisaties moeten het juiste beschermingsniveau implementeren tegen de laagst mogelijke kosten.

De cloud heeft de databack-upindustrie veranderd. Vanwege de betaalbare prijs hebben kleinere bedrijven een offsite-oplossing die een back-up van al hun gegevens maakt (en ja, zorg ervoor dat deze versleuteld is). Zowel Oracle als MySQL bieden geen ingebouwde cloudopslagoplossingen. In plaats daarvan kunt u de tools van Cloud-leveranciers gebruiken. Een voorbeeld hier zou s3 kunnen zijn.

aws s3 cp severalnines.sql s3://severalnine-sbucket/mysql_backups

Conclusie

Er zijn een aantal manieren om een ​​back-up van uw database te maken, maar het is belangrijk om de zakelijke behoeften te bekijken voordat u een back-upstrategie kiest. Zoals u kunt zien, zijn er veel overeenkomsten tussen MySQL en Oracle-back-ups die hopelijk kunnen voldoen aan uw SLA's.

Zorg er altijd voor dat je deze commando's oefent. Niet alleen wanneer de technologie nieuw voor u is, maar wanneer DBMS onbruikbaar wordt, zodat u weet wat u moet doen.

Als u meer wilt weten over MySQL, raadpleeg dan onze whitepaper The DevOps Guide to Database Backups for MySQL and MariaDB.


  1. Kan rij in Sqlite in Android niet bijwerken, maar geeft geen enkele fout

  2. Hoe PL SQL-blok in Oracle uit te voeren

  3. Gegevens invoegen van de ene databasetabel naar een andere databasetabel in Mysql

  4. Hoe de sortering van een tabel in MySQL te tonen