mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-10-31 10:39:30 +00:00 
			
		
		
		
	
		
			
	
	
		
			120 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Backup Metadata | ||
|  | slug: /deployment/backup-restore-metadata | ||
|  | --- | ||
|  | 
 | ||
|  | # Backup & Restore Metadata
 | ||
|  | 
 | ||
|  | ## Introduction
 | ||
|  | 
 | ||
|  | Before upgrading your OpenMetadata version we strongly recommend backing up the metadata. | ||
|  | 
 | ||
|  | The source of truth is stored in the underlying database (MySQL and Postgres supported). During each version upgrade there | ||
|  | is a database migration process that needs to run. It will directly attack your database and update the shape of the | ||
|  | data to the newest OpenMetadata release. | ||
|  | 
 | ||
|  | It is important that we backup the data because if we face any unexpected issues during the upgrade process, | ||
|  | you will be able to get back to the previous version without any loss. | ||
|  | 
 | ||
|  | {% note %} | ||
|  | 
 | ||
|  | You can learn more about how the migration process works [here](/deployment/upgrade/how-does-it-work). | ||
|  | 
 | ||
|  | {% /note %} | ||
|  | 
 | ||
|  | Since version 1.4.0, **OpenMetadata encourages using the builtin-tools for creating logical backups of the metadata**: | ||
|  | 
 | ||
|  | - [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) for MySQL | ||
|  | - [pg_dump](https://www.postgresql.org/docs/current/app-pgdump.html) for Postgres | ||
|  | 
 | ||
|  | For PROD deployment we recommend users to rely on cloud services for their databases, be it [AWS RDS](https://docs.aws.amazon.com/rds/), | ||
|  | [Azure SQL](https://azure.microsoft.com/en-in/products/azure-sql/database) or [GCP Cloud SQL](https://cloud.google.com/sql/). | ||
|  | 
 | ||
|  | If you're a user of these services, you can leverage their backup capabilities directly: | ||
|  | - [Creating a DB snapshot in AWS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html) | ||
|  | - [Backup and restore in Azure MySQL](https://learn.microsoft.com/en-us/azure/mysql/single-server/concepts-backup) | ||
|  | - [About GCP Cloud SQL backup](https://cloud.google.com/sql/docs/mysql/backup-recovery/backups) | ||
|  | 
 | ||
|  | ## Requirements
 | ||
|  | 
 | ||
|  | - `mysqldump` 8.3 or higher  | ||
|  | - `pg_dump` 13.3 or higher | ||
|  | 
 | ||
|  | If you're running the project using docker compose, the `ingestion` container already comes packaged with the | ||
|  | correct `mysqldump` and `pg_dump` versions ready to use. | ||
|  | 
 | ||
|  | ## Storing the backup files
 | ||
|  | 
 | ||
|  | It's important that when you backup your database, you keep the snapshot safe in case you need in later. | ||
|  | 
 | ||
|  | You can check these two examples on how to: | ||
|  | - Use pipes to stream the result directly to S3 (or AWS blob storage) ([link](https://devcoops.com/pg_dump-to-s3-directly/?utm_content=cmp-true)). | ||
|  | - Dump to a file and copy to storage ([link](https://gist.github.com/bbcoimbra/0914c7e0f96e8ad53dfad79c64863c87)). | ||
|  | 
 | ||
|  | # Example with Docker
 | ||
|  | 
 | ||
|  | Start a local instance of OpenMetadata using the `docker-compose` file provided in the repository. Then, we can use the following commands to backup the metadata: | ||
|  | 
 | ||
|  | ## MySQL
 | ||
|  | 
 | ||
|  | ### 1. Start a local docker deployment
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | docker/run_local_docker.sh | ||
|  | ``` | ||
|  | 
 | ||
|  | Ingest some data... | ||
|  | 
 | ||
|  | ### 2. Backup and Restore
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | BACKUP_FILE="backup_$(date +%Y%m%d%H%M).sql" | ||
|  | DOCKER_COMPOSE_FILE="docker/development/docker-compose.yml" | ||
|  | # backup
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec ingestion mysqldump --no-tablespaces -u openmetadata_user -popenmetadata_password -h mysql -P 3306 openmetadata_db > $BACKUP_FILE | ||
|  | # create the restore database
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec mysql  mysql -u root -ppassword -e "create database restore;" | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec mysql  mysql -u root -ppassword -e "grant all privileges on restore.* to 'openmetadata_user'@'%';" | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec mysql  mysql -u root -ppassword -e "flush privileges;" | ||
|  | # restore from the backup
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec -T ingestion mysql -u openmetadata_user -popenmetadata_password -h mysql -P 3306 restore < $BACKUP_FILE | ||
|  | ``` | ||
|  | 
 | ||
|  | ### 3. Restart the docker deployment with the restored database
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | export OM_DATABASE=restore | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE up -d | ||
|  | ``` | ||
|  | 
 | ||
|  | ## PostgreSQL
 | ||
|  | 
 | ||
|  | ### 1. Start a local docker deployment
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | docker/run_local_docker.sh -d postgres | ||
|  | ``` | ||
|  | 
 | ||
|  | Ingest some data... | ||
|  | 
 | ||
|  | ### 2. Backup and Restore
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | BACKUP_FILE="backup_$(date +%Y%m%d%H%M).sql" | ||
|  | DOCKER_COMPOSE_FILE="docker/development/docker-compose-postgres.yml" | ||
|  | # backup
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec -e PGPASSWORD=openmetadata_password ingestion pg_dump -U openmetadata_user -h postgresql -d openmetadata_db > $BACKUP_FILE | ||
|  | # create the restore database
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec -e PGPASSWORD=openmetadata_password postgresql psql -U postgres -c "create database restore;" | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec -e PGPASSWORD=openmetadata_password postgresql psql -U postgres -c "ALTER DATABASE restore OWNER TO openmetadata_user;" | ||
|  | # restore from the backup
 | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE exec -e PGPASSWORD=openmetadata_password -T ingestion psql -U openmetadata_user -h postgresql -d restore < $BACKUP_FILE | ||
|  | ``` | ||
|  | 
 | ||
|  | ### 3. Restart the docker deployment with the restored database
 | ||
|  | 
 | ||
|  | ```shell | ||
|  | export OM_DATABASE=restore | ||
|  | docker compose -f $DOCKER_COMPOSE_FILE up -d | ||
|  | ``` |