2 votes

PostgreSQL : Dump consistent state sans verrouillage

Une bonne sauvegarde de base de données est cohérente, de sorte que l'ensemble du vidage représente l'état au moment où le vidage a été lancé. Une stratégie typique pour cela sur MySQL est de verrouiller la table, afin qu'aucune donnée supplémentaire ne puisse être écrite pendant la sauvegarde. Mais le verrouillage de la base de données est une mauvaise expérience pour l'utilisateur (réponses lentes ou même délais d'attente, si le vidage prend beaucoup de temps). Je me demande donc si Postgres a une méthode pour faire des sauvegardes cohérentes sans verrouiller les tables.

(Ma stratégie de sauvegarde actuelle avec MySQL est d'avoir un esclave uniquement pour les sauvegardes, de sorte que le maître puisse continuer à répondre aux demandes des utilisateurs pendant que je peux faire un dump cohérent. Mais cela introduit d'autres points de défaillance, par exemple la réplication peut s'interrompre).

2voto

Frank Heikens Points 131

Le verrouillage et le blocage sont deux choses différentes. Certains verrous ne posent aucun problème et vous pouvez utiliser la base de données comme d'habitude (verrou d'accès partagé), tandis que d'autres verrous ont un impact majeur et stoppent votre activité.

La façon la plus simple de faire une sauvegarde d'une base de données PostgreSQL est la suivante pg_dump . Nous effectuons des sauvegardes quotidiennes d'une base de données de plusieurs To, pendant les heures de travail, à une vitesse de traitement de ~2500 tps.

Ne comparez pas PostgreSQL avec MySQL, deux bases de données très différentes. De nombreux problèmes difficiles à résoudre dans MySQL sont très simples dans PostgreSQL. La réalisation de sauvegardes cohérentes est l'un de ces problèmes.

Vous n'avez pas besoin d'un esclave pour faire une sauvegarde. C'est pratique, mais pas nécessaire.

0voto

Mikhail Kupchik Points 2431

Exécuter PostgreSQL sur ZFS et prendre un instantané en direct devrait résoudre ce problème.

Bien sûr, cet instantané aura un journal des transactions sale, vous devrez donc promouvoir l'instantané vers le clone (instantané inscriptible), puis exécuter une instance PostgreSQL séparée pour effacer/réécouter les journaux, et enfin faire un dump à partir de la seconde instance. Enfin, vous devez arrêter la deuxième instance du serveur de base de données et supprimer le clone.

Si vous n'avez pas assez de RAM pour faire tourner deux instances de PostgreSQL sur le serveur de production, vous pouvez transférer le snapshot de la base de données vers le serveur secondaire (avec zfs send, zfs receive) et y faire un dump.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X