Vraag MySQL-databaseback-up via netwerk


Server # 1 is een MySQL-databaseserver die op Debian wordt uitgevoerd en die talrijke tabellen en één specifieke tabel bevat die meer dan 100 GB groot is.

Server # 2 wordt gebruikt als een MySQL-slaaf voor replicatie, maar nu moet deze worden gereset en de replicatie opnieuw geïnitialiseerd vanwege problemen die zijn gerezen.

Er is momenteel niet genoeg ruimte op de harde schijf van server # 1 om een ​​volledige database-dump uit te voeren (dat wil zeggen minder dan 100 GB vrije ruimte). Afgezien van het upgraden van de hardware die downtime zou vereisen, wat zou dan de beste manier zijn om de database dump van server # 1 naar server # 2 intact te laten zijn, zonder corruptie, en zonder de harde schijf op de server # 1 in te vullen tijdens het proces?


4
2018-06-23 19:33


oorsprong




antwoorden:


U kunt dit doen zonder een tussenbestand en de replicatiepunten in het proces opnieuw instellen, zodat u geen updates mist (en opnieuw moet synchroniseren)

  1. Stop met replicatie van de slaaf

    slaaf> mysql 'slaaf stop;'

  2. dump de master naar de slave, gebruik de --master-data=1 vlag

    master> mysqldump -e --master-data = 1 - een enkele transactie $ DATABASE | ssh -C user @ slave 'mysql $ DATABASE'

  3. start replicatie op de slaaf

    slaaf> mysql 'slave start'

--master-data=1 veroorzaakt dat mysqldump de CHANGE MASTER TO ... instellingen bovenaan de dump om het replicatieblog en de offset in te stellen op het exacte punt in het blog van de master op het moment dat de dump werd genomen

-e maakt gebruik van het uitgebreide uitvoerformaat, in feite meerdere sets met waarde per insert-instructie, die zowel op de draad effectiever is, als wanneer ze op de slave worden toegepast.

--single-transation vertelt mysql om een ​​transactie over de hele dump te openen, in plaats van te gebruiken LOCK TABLES.


5
2018-06-24 03:08



Dat zijn echt goede opties. Afhankelijk van de bandbreedte van het netwerk kan het sneller zijn dan het mijne. - Sekenre
Vanaf het lezen van de MySQL-documenten werkt een enkele transactie niet hetzelfde met MyISAM (dev.mysql.com/doc/refman/5.0/en/...), maar met behulp van de andere informatie die u heeft verstrekt, moet deze strategie nog steeds werken zolang de tabellen vergrendeld zijn. - calvinf
Nee, myisam biedt geen ondersteuning voor transacties. Je zou echt moeten overwegen om naar innodb te converteren - Dave Cheney


Snelle en vuile manier (vanaf Server # 1):

mysqldump -u root -p bigdb | bzip2 -c | ssh -T user@server2 "cat > backup.sql.bz2"

6
2018-06-23 19:55



Ik zou het zelfs rechtstreeks naar de sql-slaveserver leiden, afgezien van dat ik denk dat dit waarschijnlijk de gemakkelijkste manier is om een ​​status te herstellen en opnieuw te repliceren ... - serverhorror


Je kunt mysql-databases van een externe host dumpen, gebruik gewoon het --host of -h-argument met mysqldump

server2# mysqldump -h server1 -u root -p --opt | gzip > database.sql.gz
server2# zcat database.sql.gz | mysql -u root -p

U kunt natuurlijk de dump naar schijf overslaan, maar de invoer is meestal langzamer dan dumpen. Als uw CPU op server2 een knelpunt is en uw schijf snel is, wilt u misschien de gzip-stap overslaan, zodat u de downtime op uw masterserver minimaliseert.

Het is duidelijk dat mijn antwoord de details overslaat die te maken hebben met opname-replicatiegegevens en ervoor te zorgen dat u een consistente dump voor replicatie hebt, zoals deze worden behandeld in de MySQL-handleiding.


1
2018-06-23 20:53





Uiteraard NFS, als er geen firewall tussen servers is. Als u een firewall heeft, moet u deze mogelijk opnieuw configureren om extra verkeer voor NFS toe te staan.

Een soortgelijke oplossing, een beetje ingewikkelder, zou zijn om smbmount op server1 en smbd op server2 te gebruiken.

Als je niet met de firewall wilt rotzooien (of als je niet wilt dat ongecodeerde gegevens tussen servers worden verzonden), zou ik sshf's aanbevelen.


0
2018-06-23 19:48



De NFS-host moet absoluut gescheiden zijn van de twee machines, de replicatie valt uit elkaar als een hoofdserver een schijfcrash heeft. - Dana the Sane


Je kunt het beste wedden, als replicatie geen optie is en de lokale server niet voldoende schijfruimte heeft, de downtime moet ondergaan en een volledige synchronisatie van de live databasebestanden moet uitvoeren.

  1. Sluit MySQL elegant af
  2. Remount de MySQL-partitie als alleen-lezen (dit helpt als je iets ophangt)
  3. Gebruik rsync, wget of iets dergelijks om een ​​volledige kopie van de dataset te bemachtigen en over te zetten naar uw tweede server
  4. Koppel de MySQL-partitie opnieuw als read-write
  5. Start MySQL opnieuw

Afhankelijk van de snelheid van de netwerkverbinding zal dit waarschijnlijk leiden tot minder downtime dan het installeren van een nieuwe schijf.

U kunt ook overwegen om een ​​tijdelijk USB-apparaat voor massaopslag aan de server toe te voegen en daarmee een volledige database-dump te maken. Dat zou moeten resulteren in zero downtime.


0
2018-06-23 19:53





Als de boxen zich op een redelijke fysieke afstand van elkaar bevinden, kun je een usb-drive aansluiten en daar je databasedump doen.

Een ander alternatief zou ssh / pipes kunnen zijn als dit op een nix-box draait, hoewel afhankelijk van welke backend je gebruikt voor opslag, het tafelslot pijnlijk kan zijn voor de grote tafel als je probeert het mysqlprocess te laten werken.

Van mysqlbox2, zoiets als:

ssh mysqlbox1 "mysqldump <options for username/pw/tables-to-dump>" > /path/to/spacious/fs/dbdump

0
2018-06-23 19:55





Als u strikt myisam-tabellen gebruikt, sluit u mysql af en cp de gegevensbestanden van server1 naar server2. Je kunt ook mysql up houden en in read-only zetten met global read lock en dan cp de tabellen omdraaien.

Bewerken voor duidelijkheid en toevoegen:

U kunt ook mysqldump de tabellen op server1 om stdout en pipe naar mysql verbonden met server2. Maar met een tabel van 100 gb kan dit enige tijd duren en moet je het nog steeds alleen-lezen doen als je consistentie wilt.


0
2018-06-23 19:52