diff --git a/doc/update/mysql_to_postgresql.md b/doc/update/mysql_to_postgresql.md index 5b9209d7df4..acd1e33f599 100644 --- a/doc/update/mysql_to_postgresql.md +++ b/doc/update/mysql_to_postgresql.md @@ -1,10 +1,11 @@ # Migrating GitLab from MySQL to Postgres If you are replacing MySQL with Postgres while keeping GitLab on the same -server all you need to do is to export from MySQL and import into Postgres as -described below. If you are also moving GitLab to another server, or if you are -switching to omnibus-gitlab, you may want to use a GitLab backup file. The -second part of this documents explains the procedure to do this. +server all you need to do is to export from MySQL, import into Postgres and +rebuild the indexes as described below. If you are also moving GitLab to +another server, or if you are switching to omnibus-gitlab, you may want to use +a GitLab backup file. The second part of this documents explains the procedure +to do this. ## Export from MySQL and import into Postgres @@ -15,15 +16,41 @@ sudo service gitlab stop # Update /home/git/gitlab/config/database.yml -git clone https://github.com/lanyrd/mysql-postgresql-converter.git +git clone https://github.com/gitlabhq/mysql-postgresql-converter.git cd mysql-postgresql-converter mysqldump --compatible=postgresql --default-character-set=utf8 -r databasename.mysql -u root gitlabhq_production python db_converter.py databasename.mysql databasename.psql psql -f databasename.psql -d gitlabhq_production +# Rebuild indexes (see below) + sudo service gitlab start ``` + +## Rebuild indexes + +The lanyrd database converter script does not preserve all indexes, so we have +to recreate them ourselves after migrating from MySQL. It is not necessary to +shut down GitLab for this process. + +``` +# Clone the database converter on your Postgres-backed GitLab server +cd /tmp +git clone https://github.com/gitlabhq/mysql-postgresql-converter.git + +# Stash changes to db/schema.rb to make sure we can find the right index statements +cd /home/git/gitlab +sudo -u git -H git stash + +# Generate the `CREATE INDEX CONCURRENTLY` statements based on schema.rb +cd /tmp/mysql-to-postgresql-converter +ruby index_create_statements.rb /home/git/gitlab/db/schema.rb > index_create_statements.psql + +# Execute the SQL statements against the GitLab database +sudo -u git psql -f index_create_statements.psql -d gitlabhq_production +``` + ## Converting a GitLab backup file from MySQL to Postgres GitLab backup files (_gitlab_backup.tar) contain a SQL dump. Using @@ -64,5 +91,6 @@ sudo -u git -H python mysql-postgresql-converter/db_converter.py gitlabhq_produc sudo -u git -H tar rf TIMESTAMP_gitlab_backup.tar db/database.sql -# Done! TIMESTAMP_gitlab_backup.tar can now be restored into a Postgres GitLab installation. +# Done! TIMESTAMP_gitlab_backup.tar can now be restored into a Postgres GitLab +# installation. Remember to recreate the indexes after the import. ```