Base de données Postgresql Timescaledb base de données de sauvegarde et de restauration de la base de données
Répertoire d'articles
- Base de données Postgresql Timescaledb base de données de sauvegarde et de restauration de la base de données
J'ai récemment rencontré un problème avec la mémoire du serveur où la base de données timescaledb est pleine. Ajoutez un nouveau disque et réfléchissez à la migration.
Étant donné que la base de données timescaledb télécharge constamment des données. Afin de réduire au maximum les pertes de données, envisagez d'utiliser un nouvel espace table pour migrer les données. La méthode est la suivante
1. Créez un espace table
Créez d'abord l'espace table tbs_cs1 pour spécifier le chemin sur le nouveau disque
1. Créez un répertoire
mkdir -p /u01/cs/pgdata
2. Attribuer des autorisations
[root@localhost ~]# chown postgres:postgres /u01/cs/pgdata
3. Créez un espace table
create tablespace tbs_cs1 owner postgres location '/u01/cs/pgdata';
2. Créez une nouvelle base de données cs espace table désigné tbs_cs1
2.1 Créer une nouvelle bibliothèque, spécifier l'espace table, installer le plugin timescaledb
CREATE DATABASE cs SET TABLESPACE tbs_cs1 ;
cs=# CREATE SCHEMA hrmw;
cs=# set search_path to hrmw;
cs=# CREATE EXTENSION timescaledb;
Maintenant que la nouvelle base de données est construite est de considérer le problème de la migration des données.
J'utilise la sauvegarde-restauration méthode.
Trois sauvegardes de la base de données d'origine
3.1 Sauvegarder toute la bibliothèque
J'ai d'abord sauvegardé toutes les bibliothèques timecaledb
/usr/pgsql-11/bin/pg_dump --file "/u01/pgsql.backup" --host "0.0.0.0" --port "5432" --username "postgres" --dbname "原数据库名" --verbose --role "postgres" --format=c --blobs --encoding "UTF8"
3.2 Super table de sauvegarde
psql --host "0.0.0.0" --port "5432" --dbname "原数据库名" --username "postgres" \
-c "\COPY (SELECT * FROM 超级表名 {后面可以跟where 加限制条件}) TO /u01/data.csv DELIMITER ',' CSV"
La quantité de données dans certaines super-tables est trop grande, et certaines données dont vous ne voulez pas peuvent être filtrées avec où et conditions
4. Restaurer la base de données
4.1 Restaurer toute la bibliothèque
Une fois la sauvegarde des données terminée, j'envisage la restauration. J'utilise d'abord pg_restore pour restaurer l'ensemble de la base de données comme la base de données postgres.
cs=# SELECT timescaledb_pre_restore();
pg_restore --username "postgres" --host "1.1.1.1" --port "5432" --password --role "postgres" --dbname "cs" --verbose /u01/pgsql.backup
cs=# SELECT timescaledb_post_restore();
Après la restauration, j'ai trouvé qu'il y avait un problème avec la super table et que les données ne pouvaient pas être insérées, mais les partitions fonctionnaient. J'ai cherché sur Internet pendant longtemps et je n'ai pas trouvé de moyen. (Quel grand gars sait le chemin, s'il vous plaît laissez un message ou discutez en privé. Merci) Mais j'ai trouvé que le rétablissement de la super table n'a pas ce problème! ! !
L'erreur est la suivante:
ERREUR: INSERT invalide sur la table racine de l'hypertable «超 表 名»
CONSEIL: Assurez-vous que l'extension TimescaleDB a été préchargée.
4.2 Restauration de super table seule
J'utilise le premier mode de restauration - supprimer la super table - restaurer le reste des données - créer une nouvelle super table - importer les données de la super table
1. Premier mode de restauration
pg_restore -s --username "postgres" --host "1.1.1.1" --port "5432" --password --role "postgres" --dbname "cs" --verbose /u01/pgsql.backup
2. Supprimez la super table d'origine
drop table "超表名" CASCADE;
3. Restaurez d'autres données de table
pg_restore -a --username "postgres" --host "1.1.1.1" --port "5432" --password --role "postgres" --dbname "cs" --verbose /u01/pgsql.backup
4 Créez une table normale et changez-la en super table
CREATE TABLE b1("ID" varchar(36) NOT NULL , "alarm_time" timestamp(6) NOT NULL,);
SELECT create_hypertable('b1', 'alarm_time', chunk_time_interval => INTERVAL '7 day');
CREATE INDEX "b1_alarm_time_idx" ON "b1" USING btree (
"create_time" DESC NULLS LAST
);
5. Restaurer les données de la super table
psql --host "1.1.1.1" --port "5432" --dbname "cs" --username "postgres" -c "\COPY FROM b1 /u01/data.csv CSV"
À ce stade, la base de données est restaurée et le reste consiste à changer de base de données
Base de données cinq commutateurs
Étant donné qu'il existe de nombreux services connectés à la base de données dans la pratique, ces services doivent être arrêtés.
5.1 Arrêter le service
Parce que le service réel n'est pas le même, arrêtez-vous en fonction de la situation réelle
5.2 Changer de base de données
J'ai tué la connexion entre la base de données d'origine et la base de données nouvellement créée cs
postgres=#
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = '原库名'
;
Parfois, vous ne pouvez pas le tuer et l'exécuter plusieurs fois jusqu'à ce que le résultat d'affichage soit 0.
5.3 Renommer la base de données
Renommez la bibliothèque d'origine sous un autre nom et renommez la nouvelle bibliothèque avec le nom de bibliothèque d'origine
postgres=# ALTER DATABASE 原库名 RENAME TO aa;
postgres=# ALTER DATABASE cs RENAME TO 原库名;
5.4 Démarrer le service
Activer le service précédemment arrêté
5.5 Afficher la base de données
Jetez un œil à la base de données? Comptez sur ok