From 9c11122a4e62e081fa44e3c8e76b389581798262 Mon Sep 17 00:00:00 2001 From: Ryan Lambert Date: Mon, 29 May 2023 09:33:07 -0600 Subject: [PATCH] Documentation improvements started on using --force. Expanded to adding relocate data steps and improving overall details about when to use various updating methods --- docker/import_mode.py | 6 +- docker/pgosm_flex.py | 8 +- docs/src/SUMMARY.md | 8 +- docs/src/data-updates.md | 63 +++++++++++ docs/src/force-load.md | 101 ++++++++++++++---- ...sm-flex-with-force-inconsistent-region.jpg | Bin 0 -> 45934 bytes docs/src/relocate-data.md | 36 +++++++ docs/src/replication.md | 14 +-- docs/src/update-mode.md | 2 +- 9 files changed, 199 insertions(+), 39 deletions(-) create mode 100644 docs/src/data-updates.md create mode 100644 docs/src/pgosm-flex-with-force-inconsistent-region.jpg create mode 100644 docs/src/relocate-data.md diff --git a/docker/import_mode.py b/docker/import_mode.py index 905ed258..1e93d653 100644 --- a/docker/import_mode.py +++ b/docker/import_mode.py @@ -68,11 +68,11 @@ def okay_to_run(self, prior_import: dict) -> bool: Only the replication key is specifically used """ self.logger.debug(f'Checking if it is okay to run...') - # If no prior imports, do not require force if self.force: self.logger.warn(f'Using --force, kiss existing data goodbye') return True + # If no prior imports, do not require force if len(prior_import) == 0: self.logger.debug(f'No prior import found, okay to proceed.') return True @@ -86,8 +86,8 @@ def okay_to_run(self, prior_import: dict) -> bool: self.logger.debug('Okay to proceed with replication') return True - msg = 'A prior import exists.' - self.logger.warn(msg) + msg = 'Prior data exists in the osm schema and --force was not used.' + self.logger.error(msg) return False def set_append_first_run(self): diff --git a/docker/pgosm_flex.py b/docker/pgosm_flex.py index eb0fdc74..6b10a9f3 100644 --- a/docker/pgosm_flex.py +++ b/docker/pgosm_flex.py @@ -35,7 +35,7 @@ @click.option('--debug', is_flag=True, help='Enables additional log output') @click.option('--force', is_flag=True, - help='Danger! Forces PgOSM Flex to load the data even if this will overwrite pre-existing data. This only impacts usage when connecting to an external Postgres connection, not when using the internal-Docker Postgres instances.') + help='Danger! Forces PgOSM Flex to load the data even if this will overwrite pre-existing data. See https://pgosm-flex.com/force-load.html for more.') @click.option('--input-file', required=False, default=None, @@ -99,7 +99,10 @@ def run_pgosm_flex(ram, region, subregion, debug, force, layerset, layerset_path, sp_gist, replication) db.wait_for_postgres() if force and db.pg_conn_parts()['pg_host'] == 'localhost': - logger.warning('Using --force with the built-in database is unnecessary.') + msg = 'Using --force with the built-in database is unnecessary.' + msg += ' The pgosm database is always dropped and recreated when' + msg += ' running on localhost (in Docker).' + logger.warning(msg) if replication: replication_update = check_replication_exists() @@ -128,6 +131,7 @@ def run_pgosm_flex(ram, region, subregion, debug, force, if not import_mode.okay_to_run(prior_import): msg = 'Not okay to run PgOSM Flex. Exiting' + logger.error(msg) sys.exit(msg) # There's probably a better way to get this data out, but this worked right diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 9e8c450c..2e2815ca 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -20,13 +20,15 @@ - [Postgres Permissions](./postgres-permissions.md) - [Using External Postgres Connection](./postgres-external.md) -- [Stay Updated with Replication](./replication.md) -- [Using Update Mode](./update-mode.md) -- [Force Load](./force-load.md) +- [Data updates](./data-updates.md) + - [Using Replication](./replication.md) + - [Relocate Data](./relocate-data.md) + - [Using Update Mode](./update-mode.md) - [QGIS Styles](./qgis-styles.md) # Developers +- [Force Load](./force-load.md) - [Projects using PgOSM Flex](./projects.md) - [Build and Push Docker Images](./docker-build.md) - [Testing PgOSM Flex](./tests.md) diff --git a/docs/src/data-updates.md b/docs/src/data-updates.md new file mode 100644 index 00000000..94294c22 --- /dev/null +++ b/docs/src/data-updates.md @@ -0,0 +1,63 @@ +# Data updates + +Keeping OpenStreetMap data recent and up-to-date is important to many projects. +However, this concept can mean very different things depending on the needs at +hand. + +There are three (3) main ways to run subsequent imports using PgOSM Flex. + +* [Replication](replication.md) +* [Relocate data](relocate-data.md) +* [Manual Updates](update-mode.md) + +## Replication + +[Replication](replication.md) should be the default first choice to consider. +Replication is best used when you only want to load one region of data and want +to keep the region's data recent. + +Pros: + +* Fast updates after the first import +* Easy + +Cons: + +* Increased database size +* Little flexibility after initial import + +## Relocate data + +[Relocating data](relocate-data.md) involves renaming the `osm` schema. +This allows PgOSM Flex to run in single-import mode, and to import any number +of different regions. + +Pros: + +* Simple +* Smaller database size per region +* Very customizable + +Cons: + +* Always single-import +* Duplicates a lot of data if using for snapshots over time on one region + +## Manual Updates + +[Manual Updates](update-mode.md) provide significant flexibility with a tradeoff +in import performance + +Pros: + +* Very customizable + +Cons: + +* Very slow updates +* Poorly documented in PgOSM Flex + + + + + diff --git a/docs/src/force-load.md b/docs/src/force-load.md index 78046221..cad1b415 100644 --- a/docs/src/force-load.md +++ b/docs/src/force-load.md @@ -1,32 +1,40 @@ # Force Load -PgOSM Flex attempts to avoid accidentally overwriting existing data -when using a database -[external to](./postgres-external.md) the PgOSM Flex Docker container. > Added in PgOSM Flex 0.8.1. -## PgOSM Tries to be Safe +---- -Assumes you have followed the instructions on the -[Postgres External section](./postgres-external.md). +## ⚠️ Danger ahead ⚠️ +The examples in this section can do bad things in production setups. +The `--force` feature exists for development use cases. +**Most users should consider moving old data out of the way using the methods +described in the [relocate data](./relocate-data.md).** -```bash -source ~/.pgosm-db-myproject - -docker run --name pgosm -d --rm \ - -v ~/pgosm-data:/app/output \ - -v /etc/localtime:/etc/localtime:ro \ - -e POSTGRES_USER=$POSTGRES_USER \ - -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD \ - -e POSTGRES_HOST=$POSTGRES_HOST \ - -e POSTGRES_DB=$POSTGRES_DB \ - -e POSTGRES_PORT=$POSTGRES_PORT \ - -p 5433:5432 -d rustprooflabs/pgosm-flex +---- + +## PgOSM Flex *Tries* to be Safe + +PgOSM Flex **attempts** to avoid accidentally overwriting existing data +when using a database +[external to](./postgres-external.md) the PgOSM Flex Docker container. +It does this by checking the data stored in the `osm.pgosm_flex` table. + +> The `--force` feature only applies to external database connections. The internal database is always dropped and recreated when using the built-in database. + +This section assumes you have followed the instructions on the +[Postgres External section](./postgres-external.md) including +[setting up permissions](postgres-permissions.md). +The protection against overwriting data is built into the `pgosm_flex.py` logic +ran via `docker exec`. With PgOSM Flex 0.8.1 and later, running the following +command twice in a row will result in an + + +```bash docker exec -it \ pgosm python3 docker/pgosm_flex.py \ --ram=8 \ @@ -38,11 +46,15 @@ Running the `docker exec` step a second time would result in the following error. ```bash -2023-05-14 14:59:33,145:WARNING:pgosm-flex:import_mode:A prior import exists. -Not okay to run PgOSM Flex. Exiting +2023-05-29 08:08:19,495:ERROR:pgosm-flex:import_mode:Prior data exists in the osm schema and --force was not used. +2023-05-29 08:08:19,495:ERROR:pgosm-flex:pgosm_flex:Not okay to run PgOSM Flex. Exiting ``` -To overwrite and reload data, use the `--force` option. + +## Using `--force` + +To overwrite and reload data, use the `--force` option with the `docker exec` +command. ```bash @@ -54,13 +66,56 @@ docker exec -it \ --force ``` -## Using `--force` -This outputs the following message during import. +Using `--force` outputs the following message during import when prior data exists. ``` 2023-05-14 15:09:12,457:WARNING:pgosm-flex:import_mode:Using --force, kiss existing data goodbye ``` +### Only overwrites tables in new `--layerset` + +Using `--force` can cause unexpected mismatches between tables when different +[layersets](layersets.md) are used. This section illustrates this problem. + +First run `docker exec` as shown in the [quick start](./quick-start.md) guide. +This loads the District of Columbia subregion with the default layerset. + +```bash +docker exec -it \ + pgosm python3 docker/pgosm_flex.py \ + --ram=8 \ + --region=north-america/us \ + --subregion=district-of-columbia +``` + + +Now run again with `--force` and `--layerset=minimal`. A different region +(Rhode Island) is also used to help illustrate the problem. + +```bash +docker exec -it \ + pgosm python3 docker/pgosm_flex.py \ + --ram=8 \ + --region=north-america/us \ + --subregion=rhode-island \ + --force \ + --layerset=minimal +``` + +The following image shows that while the `osm.place_polgyon` data is correctly loaded +with the Rhode Island region's data, the `osm.building_point` retained the +data from Washington D.C. This happens because `--force` only allows PgOSM Flex +to overwrite data as defined by the `--layerset` option. If tables were created +by layers not used in the latest `--layerset`, they will be left in the database +as-is. + +![Image showing a map of the northeast region of the U.S. containing Washington D.C. to Rhode Island. In the upper right corner (NE on the map) the Rhode Island region shows the place polygon data loaded as expected. The lower left corner (SW on the map) shows the building data, not included in the minimal layerset, is still displaying in the D.C. area.](./pgosm-flex-with-force-inconsistent-region.jpg) + + + +While this problem is most apparent when using different regions, it can also be +a problem with the same region if a user querying the data assumes all tables +were updated at the same time. diff --git a/docs/src/pgosm-flex-with-force-inconsistent-region.jpg b/docs/src/pgosm-flex-with-force-inconsistent-region.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b66c4704178a80806a060d69ab809992552aa8f1 GIT binary patch literal 45934 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 Do not use these instructions when using `--append`, `--update`, or `--replication`. Something will most likely break. + + +## Why relocate data + +There are two common reasons you may want to relocate data. The same approach +works for both of these scenarios. + +* Snapshots over time +* Different regions + +If your goal is to have the latest data always available, consider using +[replication](replication.md) instead. + + +## Rename Schema + +PgOSM Flex always uses the `osm` schema. +The best way to relocate data is to simply rename the schema. This quickly moves +existing data out of the way for future PgOSM Flex use. The following query +renames `osm` to `osm_2023_05`. + + +```sql +ALTER SCHEMA osm RENAME TO osm_2023_05; +``` + diff --git a/docs/src/replication.md b/docs/src/replication.md index 7238f070..6c7d65b5 100644 --- a/docs/src/replication.md +++ b/docs/src/replication.md @@ -1,12 +1,9 @@ -# Stay Updated with Replication +# Using Replication The `--replication` option of PgOSM Flex enables `osm2pgsql-replication` to provide an easy and quick way to keep your OpenStreetMap data refreshed. -> The `--replication` mode is stable as of 0.7.0. It was added as an experimental feature in 0.4, originally under the `--append` option. - - PgOSM Flex's `--replication` mode wraps around the `osm2pgsql-replication` package included with `osm2pgsql`. The first time running an import with `--replication` mode runs osm2pgsql normally, with `--slim` mode and without `--drop`. @@ -18,8 +15,9 @@ tables (`--slim`) must be left in the database (no `--drop`). > Important: The original `--append` option is now under `--replication`. The `--append` option was removed in PgOSM Flex 0.7.0. See [#275](https://github.com/rustprooflabs/pgosm-flex/issues/275) for context. +## Use tagged version -When using replication you need to pin your process to a specific PgOSM Flex version +When using replication you should pin your process to a specific PgOSM Flex version in the `docker run` command. When upgrading to new versions, be sure to check the release notes for manual upgrade steps for `--replication`. The release notes for @@ -36,6 +34,7 @@ your specific database and process.** ---- +## Max connections The other important change when using replication is to increase Postgres' `max_connections`. See [this discussion on osm2pgsql](https://github.com/openstreetmap/osm2pgsql/discussions/1650) @@ -59,6 +58,8 @@ docker run --name pgosm -d --rm \ -c max_connections=300 ``` +## Using `--replication` + Run the `docker exec` step with `--replication`. @@ -68,7 +69,6 @@ docker exec -it \ --ram=8 \ --region=north-america/us \ --subregion=district-of-columbia \ - --pgosm-date 2022-12-30 \ --replication ``` @@ -76,5 +76,5 @@ Running the above command a second time will detect that the target database has `osm2pgsql-replication` setup and load data via the defined replication service. -> Note: The `--pgosm-date` parameter is ignored during subsequent imports using `--replication`. + diff --git a/docs/src/update-mode.md b/docs/src/update-mode.md index 921af367..b7540d61 100644 --- a/docs/src/update-mode.md +++ b/docs/src/update-mode.md @@ -1,4 +1,4 @@ -# PgOSM Flex Update Mode +# Using Update Mode Running in experimental Update mode enables using osm2pgsql's `--append` option.