Migrate Mattermost from MySQL to PostgreSQL: what the move involves
If your self-hosted Mattermost server still runs on MySQL, you need to move its database to PostgreSQL to stay on a supported configuration. Mattermost ended support for MySQL with v11.0, and it has made PostgreSQL its database of choice since v8.0. Mattermost documents a migration path, so the work is well defined, but its effort depends on three things: the size of your database, whether Boards, Playbooks or Calls data is in use, and how many trial runs your team needs before cutover.
The migration moves the Mattermost database itself, which holds the content and configuration the server reads on every request. The server binary stays the same, but the database it depends on changes, so the move must be sequenced with the server version upgrade. Mattermost recommends upgrading to v8.x or later first if you are running an older release. Choose your target server version before you plan the database cutover, and check the support dates on the Mattermost server releases page, since a target that loses support soon creates a second project within months.
Mattermost offers an automated path using the migration-assist tool and a manual path. Both require pgloader, which you install separately. Mattermost recommends running migration-assist on a separate server against a copy of the MySQL database, with 2 CPU cores and 16 GB RAM for the tool, and it says the PostgreSQL server should initially match the size of the MySQL server. Confirm who provisions that separate host, how the database copy is taken, and how the copy is refreshed between trial runs.
Inventory plugin use before you pick a path. Mattermost's guide covers plugin data migrations for Boards, Playbooks and Calls, so list which of these are installed and actively used, and confirm with the vendor documentation how each is handled in your version. The guide also states that its processes support AWS RDS databases, so confirm whether your target is a self-managed PostgreSQL server or a managed service, and choose a PostgreSQL major version that is still supported at cutover.
DeployOpen scopes this work in writing before any work starts. The written scope covers the upgrade sequence, the trial runs against copies, the cutover window, the rollback plan, the backup points and the sign-off criteria your team will accept. Most engagements are fixed-scope, so the quote follows from that document. Ask any partner to state in writing how many trial runs are included and who verifies the results.
What maps cleanly from MySQL to PostgreSQL in a Mattermost database
This table compares each part of a Mattermost MySQL database with its PostgreSQL target and notes where the migration needs checking. Use it to decide which items you can plan to carry over and which you must verify against your own schema, server version and plugin set. The main takeaway is that core data maps in a documented way, but plugin data and file storage need explicit checks before cutover.
| Source capability | PostgreSQL target | Migration notes |
|---|---|---|
| Posts, channels and team membership | Core Mattermost tables in PostgreSQL, loaded by migration-assist or the manual pgloader path | Follow the documented MySQL to PostgreSQL guide. Confirm row counts and message integrity on the test copy. |
| Users and sessions | User, session and authentication records in PostgreSQL | Confirm that SSO or LDAP-linked accounts still sign in after cutover, and check how sessions expire. |
| File metadata | Metadata rows in PostgreSQL that reference stored files | Keep file contents in existing storage (S3, S3-compatible or NAS). Confirm that references still resolve after cutover. |
| Boards plugin data | Boards tables migrated as plugin data | Covered by the documented guide. Confirm the Boards plugin version and that boards and cards display after import. |
| Playbooks plugin data | Playbooks tables migrated as plugin data | Covered by the documented guide. Confirm runs, checklists and their history on the copy before planning cutover. |
| Calls plugin data | Calls records held in the database | Confirm which Calls settings and records live in the database and which live in external services. |
| PostgreSQL version | A PostgreSQL major version still in support, such as 17 or 18 | Mattermost made PostgreSQL its database of choice from v8.0. Confirm your server version and the PostgreSQL support dates. |
How plugin data for Boards, Playbooks and Calls moves with the database
Plugin data is the part of a MySQL to PostgreSQL move that most often gets treated as an afterthought, and the Mattermost migration guide covers it directly: it includes plugin data migrations for Boards, Playbooks and Calls. Before anyone takes the copy that feeds the trial run, record the plugin inventory on the source server: the installed version of each plugin, whether each one is enabled, and where each keeps its data. Boards and Playbooks store their content in the database, so their rows travel with the rest of the schema, but you should still confirm which tables and records belong to them. Calls is different because its operating model depends on components outside the database, so its inventory needs a line for those as well. Capture the list in a document that the trial and production runs both reference.
Once the trial run finishes against the copy, check each plugin separately instead of relying on the server starting cleanly. For Boards, open several existing boards, confirm that cards, properties, comments and sharing settings display as they did on MySQL, and confirm that a new card can be created and edited. For Playbooks, open representative playbooks and runs, confirm that run history, owners, checklists and status updates are present, and confirm that a test run can progress through its steps. Compare the plugin enabled state and version on PostgreSQL with the inventory you recorded before the copy. Any plugin that is disabled, missing or on an unexpected version after the trial needs an explanation before you schedule the production cutover.
Calls depends on external components that the database migration does not move, so the trial run cannot prove that Calls works on the new database by itself. Confirm in your own environment which external services the Calls configuration uses, where those services run, and whether their addresses, credentials and network paths remain valid after the server changes. Test a call with real participants on the trial server, including joining, leaving and any recording or transcription features your organization has enabled. Note that the documentation supports the Calls data migration path, but any external dependency your deployment relies on should be verified by your team rather than assumed to work because the database loaded correctly.
Plan for plugin problems as a cutover risk. Decide in advance who signs off on each plugin, what happens if one fails the trial checks, and whether users can be told that a feature is unavailable for a short period. Keep the MySQL source untouched until every plugin check has passed on the copy and the production steps are confirmed. Also confirm the plugin versions you intend to run after the move are supported with the Mattermost server version you are targeting, because plugin behavior can change between server releases. Writing these decisions into the runbook before the trial starts makes the production window shorter and reduces guesswork if something fails.
Documented migration paths: migration-assist and manual pgloader
Mattermost documents two ways to move a MySQL database to PostgreSQL: an automated migration-assist tool and a manual process built on pgloader. The cards compare what each path asks of your team, when each fits, and which prerequisites apply before either one starts.
Automated migration-assist tool
Migration-assist is the automated path. Mattermost recommends running it on a separate server against a copy of the MySQL database, which keeps the production source out of the process. The guide suggests 2 CPU cores and 16 GB RAM for the tool host. This path suits a team that wants the documented tool to drive the data movement and can provide a staging host, a MySQL copy and time to review results before cutover. Confirm the tool version against your target Mattermost server before you begin.
Manual path with pgloader
The manual path uses pgloader to load the MySQL data into PostgreSQL. pgloader must be installed separately, so your team owns its version, installation and run procedure on the host. Choose this path when database engineers need to see and control each load step, or when the automated tool cannot run in your environment. Plan for the team to review the documented steps, test them on a copy, and keep the MySQL source available until validation passes.
Matching the path to your team
Both paths end in a PostgreSQL database that Mattermost reads, so the choice depends on who performs the work. Migration-assist keeps the procedure inside a documented tool, so operators write fewer steps by hand. The manual path requires working knowledge of MySQL, PostgreSQL and pgloader, plus more time for testing each stage. Ask your internal team or implementation partner to map both paths against available skills, change windows and the staging capacity you can provide.
AWS RDS source and target
The guide states that both processes support AWS RDS databases. If the MySQL source or the PostgreSQL target runs on RDS, confirm the exact engine versions, the network path from the migration host, and any parameter settings the guide requires before you start. Check how RDS snapshots and backups fit the rollback plan, since the copy used for testing must be restorable. Confirm current RDS support statements with the guide, because managed-service details change over time.
Upgrade to v8.x first
Mattermost recommends upgrading to v8.x or later before migrating. Mattermost made PostgreSQL its database of choice from v8.0, and support for MySQL ended with v11.0, so the version gap between your current server and the target shapes the order of work. Confirm the target server version and the documented upgrade order in the important upgrade notes before scheduling. Give the upgrade its own test run on a copy so it is validated before the database move begins.
Sizing the PostgreSQL target
Mattermost says the PostgreSQL server should initially match the MySQL server's size. Use that as the starting baseline, then review CPU, memory, storage and connection limits against the user load and data volume you observe on the copy. Ask for a sizing review that compares the copy's storage footprint with the planned target before anything is provisioned. Record the result so the cutover team can see why the target was sized the way it was.
Sizing the migration server and PostgreSQL target before the trial run
Size the migration host and the PostgreSQL target before you schedule a trial run, because the documented approach depends on both. Mattermost recommends running migration-assist on a separate server against a copy of the MySQL database. It suggests 2 CPU cores and 16 GB RAM for the tool, and it says the PostgreSQL server should initially match the size of the MySQL server. Treat those as the documented starting points, then confirm them against your own data. Ask your platform team whether the migration host can be provisioned in the same cloud account or data center as production, and whether it can reach both the MySQL copy and the new PostgreSQL instance without opening paths to production.
Running the process on a separate host and against a copy keeps production load and risk out of the exercise. The migration reads and rewrites large tables, so it can compete with live users for CPU, memory, disk I/O and connections if it runs on the production database or on an application node. A copy lets your team stop, repeat and time the process as often as needed without touching the live Mattermost server. It also means a failed attempt cannot corrupt the source data you will need for the real cutover. Keep the copy's source snapshot time recorded, so every trial run can be compared with the same baseline.
Before you accept the sizing, measure the source database and the plugin data it holds. At minimum, record the total database size on disk, the row counts for the largest tables (posts, channels, users, files and file metadata), and the size of the tables used by the Boards, Playbooks and Calls plugins. Also record the size of any file storage that the migration does not move, because it will still need to be reachable from the new server. Compare these figures with the free space and memory on the migration host and with the storage you plan to allocate to PostgreSQL. If the copy will not fit on the migration host with room for the converted database, plan more disk before the trial run rather than during it.
Use the same measurements to check the PostgreSQL target. Matching the MySQL server's size is the documented starting point, so confirm that the CPU, memory, storage throughput and connection limits you plan to give PostgreSQL are at least equal to the MySQL server's current allocation. Note the PostgreSQL major version you intend to run. Supported versions at the time of writing are 14 through 18, and version 14 reaches end of support on November 12, 2026, so confirm the release date and support end date for the version you select against the PostgreSQL versioning policy before you commit. Record the chosen values in a sizing worksheet that the trial run will be measured against.
Decide in advance what result would make the sizing acceptable. Examples include whether the trial run completes on the migration host with headroom, whether the converted database size is within the storage you allocated, and whether row counts match between source and target for each table you check. If any figure falls outside the range your team agreed, change the sizing and repeat the trial rather than adjusting the acceptance criteria after the fact. Ask any implementation partner to deliver this worksheet as part of the written scope, with the measurements taken from your environment rather than from generic assumptions.
How the MySQL to PostgreSQL trial run, parallel run and cutover are sequenced
This sequence moves a Mattermost database from MySQL to PostgreSQL in stages, so each stage produces evidence before the next one starts. Trial runs on a copy carry most of the validation because a parallel run is limited for a database move. The sequence ends with MySQL kept read-only for rollback until the reader accepts the result.
Inventory server version, plugins and database size
Record the Mattermost server version, every installed plugin with its version, and the size of the MySQL database. Plugins to check include Boards, Playbooks and Calls, because their data needs its own migration handling. The Mattermost administrator and the database administrator complete this together. The step is done when every plugin has a version and a named owner, and the database size is written down so the PostgreSQL target can start at a comparable size, which Mattermost recommends.
Upgrade Mattermost to a supported path
Upgrade the existing server to v8.x or later first, as the documented migration path requires, then move to a release that is still supported. Mattermost's upgrade notes state that MySQL support ended with v11.0, so confirm the intermediate versions with the upgrade notes before you start. Check the server releases page for the final target. Mattermost v11.7 is an Extended Support Release with support ending 2027-05-15. The step is done when the server runs the chosen version and sign-in, channels and integrations work after the upgrade.
Provision the migration host and PostgreSQL target
Build a separate migration host, because Mattermost recommends running migration-assist on its own server against a copy of the MySQL database. Mattermost suggests 2 CPU cores and 16 GB RAM for the tool. Install pgloader on the host, since it is not bundled. Provision the PostgreSQL target at roughly the size of the MySQL server, and pick a PostgreSQL major version that is still supported on the planned cutover date. The step is done when the host reaches both databases and the tool and pgloader versions run.
Run a full trial migration on a copy
Restore a copy of the production MySQL database to the migration host and run the full migration, using migration-assist or the manual pgloader path. Keep the production database untouched. Record the run time, every warning and every error in a log. Fix the cause of each error and repeat the run from a fresh copy until a complete run finishes without unexplained errors. The step is done when the team has a clean run log and a repeatable procedure.
Validate users, channels, posts, files and plugin data
Compare record counts for users, channels and posts between the MySQL copy and the PostgreSQL result, then check a sample of records by hand. Sign in as test users and confirm they see their teams and channels. Open a set of file attachments and confirm the new server can reach the file storage. Check Boards, Playbooks and Calls data in the plugins. Record each check and its result on a shared checklist. The step is done when the business owner signs off the checklist for the trial copy.
Rehearse the cutover window with backups
Rehearse the full cutover on a non-production environment that matches production as closely as possible. Take and test backups of the MySQL database, the Mattermost configuration and the file storage before each rehearsal. Practice stopping writes, running the final migration, starting Mattermost on PostgreSQL and checking health. Also rehearse the rollback path. The step is done when the team has a timed runbook, a tested restore from backup and a confirmed rollback procedure.
Run cutover and confirm the result
Announce the maintenance window, stop Mattermost, run the final migration from a current copy of MySQL, and point the server at PostgreSQL. Start the service and confirm health checks, sign-in, message posting, file access and plugin behavior. A parallel run is limited for a database move because two live systems cannot both accept writes safely, so the trial runs carry most of the validation. The step is done when the confirmation checklist passes and the business owner accepts the cutover.
Keep MySQL for rollback, then decommission
Keep the MySQL database in read-only mode after cutover so the team can roll back if a problem appears. Monitor the new environment during the agreed review period. Once the reader accepts the result in writing, take a final archived backup of MySQL, retire the migration host and remove the old database from service according to your retention policy. The step is done when the sign-off record and the archived backup are both stored.
Why trial runs replace a parallel run for this database move
A database move like this one cannot be validated by running the old MySQL server and the new PostgreSQL server side by side as two live, writable systems. Once users post messages on one side, the other side diverges, and reconciling two sets of writes is not a task the documented procedure supports. Confidence therefore comes from repeated trial runs against copies of the database, followed by a rehearsed cutover with a defined point at which the team decides whether to roll back.
Each trial run should use a copy of the MySQL database, with migration-assist running on a separate server as Mattermost recommends, so the production source is never touched. After every run, compare the results with checks the team can repeat: row counts for key tables such as posts, channels and users, checksums or spot checks on a sample of records, and a review of how the plugin data for Boards, Playbooks and Calls arrived. Record what changed between runs so that each pass shows the problem was fixed rather than moved. Confirm the exact sequence of trial steps, including how the PostgreSQL server should be sized at first, with Mattermost's MySQL to PostgreSQL guide.
Before the first trial, the team should define four things in writing. First, acceptance tests: which queries, log-ins, file attachments and plugin views must work, and what counts as a pass. Second, sign-off: a named person or group who accepts the results for the business and another for the technical side, so the decision does not default to whoever is available on cutover night. Third, the backup and rollback plan: a verified backup of the MySQL database taken immediately before cutover, and a clear statement of how the team returns users to the MySQL system if acceptance fails. Fourth, the downtime window the organization can accept, measured from the first user-facing stop to the moment the new system is confirmed.
The rollback decision point belongs in the cutover plan, not in the incident room. Set the time after which the team stops trying to fix forward and returns to MySQL, and state who makes that call. Rehearse that path on a copy so the people involved have already seen the commands and the expected output.
Treat the downtime estimate from a trial as a measurement of your environment, not a promise. Trial timing depends on database size, hardware and network path, and the team should size the window from its own results. Confirm the exact downtime steps with Mattermost's documentation, and make the window part of the written scope so that any quote reflects the same assumptions.
What drives the cost and duration of the MySQL to PostgreSQL move
This table lists the factors that change effort and cost in a Mattermost move from MySQL to PostgreSQL, why each one matters and what to request in a written quote. Check each row against your own database, plugins and deployment before you ask for a scope. DeployOpen does not publish prices, and a quote follows from the written scope.
| Driver | Why it changes the work | What to ask for in a quote |
|---|---|---|
| Database size | Larger data takes longer to copy, validate and rehearse. Mattermost suggests the PostgreSQL server initially match the MySQL server's size. | Measured database size, growth rate and the PostgreSQL sizing included in scope. |
| Plugin data (Boards, Playbooks, Calls) | Each plugin has its own data process in the Mattermost guide, so installed plugins and their state add steps. | Installed plugins, their versions and whether each plugin's data is in scope. |
| Server version distance | Migration starts from v8.x or later, and MySQL support ended with v11.0, so older servers need upgrades first. | Current server version, the upgrade steps included and how they are scoped. |
| Number of trial runs | Each rehearsal on a copy repeats the load, checks and fixes, so the run count changes effort directly. | Number of rehearsal runs in scope and who provides the copy environment. |
| Integrations and custom schema changes | Custom integrations, bots or direct database queries may depend on MySQL behavior and need checks on PostgreSQL. | Inventory of integrations and custom database access, and who fixes each item. |
| HA topology and shared file storage | HA requires the Enterprise or Enterprise Advanced plan, shared file storage on every node and replica routing for reads. | Node count, file storage design, replica count and confirmation of the license plan. |
| Target PostgreSQL platform and backup design | Self-managed PostgreSQL needs designed replication and backups, and PostgreSQL has no built-in automatic failover software. | Hosting choice, PostgreSQL major version, backup retention, restore test and failover tooling. |
| Acceptance testing | Agreed checks for record counts, search, file access, plugin behavior and sign-in decide when cutover is complete. | Written acceptance criteria, test data sets and the named person who signs off. |
| Migration host and tooling | migration-assist runs on a separate server, suggested at 2 CPU cores and 16 GB RAM, with pgloader installed separately. | Host specification, pgloader version and who installs and maintains the tooling. |
What usually goes wrong in a MySQL to PostgreSQL move and how to prevent it
Most failed Mattermost database moves trace back to a step that was skipped, sized too small or never rehearsed. The cards below group these risks by stage: preparation, data and sizing, infrastructure, and cutover. Work through them in order before you schedule a production window.
Running against production instead of a copy
Teams sometimes point the migration tool or pgloader at the live MySQL database to save setup time. Mattermost recommends running migration-assist on a separate server against a copy of the MySQL database, so a failed run or a long-running read cannot affect users. Before the first run, confirm the copy is recent enough for your cutover plan, that the test server can reach it, and that the test does not write to the source.
Prerequisites and tooling skipped
Two prerequisites are easy to miss. Mattermost recommends upgrading to v8.x or later before the move, and MySQL support ended with v11.0, so an older server needs its upgrade path planned before database work starts. pgloader must also be installed separately, and its version and configuration should match the Mattermost guide on the test server before the first run.
Plugin data missing after cutover
Boards, Playbooks and Calls store data that a basic table copy can miss, so a cutover can look successful while plugin content is absent. The Mattermost MySQL to PostgreSQL guide covers plugin data migrations for these three plugins. After the test run, confirm each plugin is enabled on the target and compare boards, playbook runs and call records against the source.
PostgreSQL target sized too small
Mattermost says the PostgreSQL server should initially match the MySQL server's size. Teams that provision a smaller instance to reduce cost often see slow queries and long import times under production load. Record CPU, memory, storage and connection counts on the MySQL server during a busy period, size the target to at least that level, and ask your DBA whether connection pooling such as PgBouncer belongs in the design.
Shared file storage missing in high availability
A Mattermost high availability cluster requires shared file storage on Amazon S3, an S3-compatible service or NAS mounted on every node, and high availability is available only on the Enterprise and Enterprise Advanced plans. Local file system storage does not work correctly in a cluster and risks corrupting files. Confirm that every node reads attachments from the same backend, and check how existing files are reachable after cutover.
Cutover without tested rollback or integration updates
Cutover fails in two ways that you can test in advance. Without a rehearsed rollback, the team may have no safe route back to MySQL once users write to PostgreSQL. Bots, webhooks and integrations that still reference the old database host can also keep writing to the wrong place. Rehearse rollback on the copy, name the person who decides to revert, and inventory every integration and service account that points at the old host before the window opens.
Questions teams ask before moving Mattermost from MySQL to PostgreSQL
How much does moving Mattermost from MySQL to PostgreSQL cost?
The cost depends on the scope of work, and DeployOpen issues a fixed quote from a written scope before any work starts. DeployOpen does not publish a price list. The main drivers are the size of the MySQL database, the number of Mattermost environments involved, whether plugin data for Boards, Playbooks and Calls must move, whether the server must be upgraded to v8.x or later first, and how many trial runs the plan includes. Ask for the quote to separate one-time migration work from any recurring support or retainer. Mattermost licensing is a separate cost. Its plans are prepaid annual subscriptions based on seat licenses, and it lists no public prices, so confirm license terms with Mattermost sales.
How long does a Mattermost database migration take?
Duration depends on the scope, and no fixed timeline applies to every environment. The biggest factors are the size of the MySQL database, the time needed to run the migration tool against a copy, the work to size and prepare the PostgreSQL server, the number of trial runs, and the testing window before cutover. Mattermost recommends running migration-assist on a separate server against a copy of the MySQL database, which means the copy and the tool run time count toward the schedule. Ask for a timeline in the written quote that shows each phase, and confirm database-specific timing with Mattermost before you commit to a cutover date.
What does the migration need from our internal team?
Your team supplies access and decisions that only your organization can provide. You need a copy of the MySQL database, a separate server for the migration tool (Mattermost suggests 2 CPU cores and 16 GB RAM for the tool), and a PostgreSQL server that initially matches the MySQL server's size. You also need a named database administrator, an application owner who can test channels, files and plugins, and an approved maintenance window for cutover. Someone must confirm which plugins are in use and which versions are installed, and someone must approve the rollback plan. Clarify these responsibilities in the scope so both parties know who performs each task.
Can our team migrate Mattermost to PostgreSQL using the documented guide?
Yes, a team with database and Linux administration experience can follow the documented guide. Mattermost documents an automated path using migration-assist and a manual path, and both require pgloader to be installed separately. The manual path gives more control but needs careful validation at each step. Your team should consider whether it has staff who can rehearse the migration on a copy, handle a failed run, and keep production stable during cutover. DeployOpen can plan, run and document the migration in your own infrastructure, or support your team as it works through the guide. Confirm the current steps and prerequisites in the Mattermost guide for your server version before you start.
Does the MySQL to PostgreSQL migration move plugin data for Boards and Playbooks?
Yes, Mattermost's MySQL to PostgreSQL guide covers plugin data migrations for Boards, Playbooks and Calls. Plugin data is often the part of the migration that teams overlook, so include it in the inventory from the start. Confirm which of these plugins your deployment uses, the plugin versions installed, and whether the guide's steps apply to those versions. Test each plugin on the trial copy by checking boards, playbook runs and call history. Add these checks to the acceptance criteria in the scope so plugin data is verified along with channel messages and files before cutover.
Is AWS RDS supported as the target for a Mattermost PostgreSQL migration?
Yes, Mattermost states that the migration processes support AWS RDS databases. Support applies to the migration process, but your target still needs the right PostgreSQL major version, instance size, storage, backup settings and network access for your Mattermost servers. PostgreSQL supports several major versions at once, and each has its own end-of-support date, so pick a version that will remain supported for the planned life of the deployment. Confirm the RDS configuration details with Mattermost's guide and your AWS account team. DeployOpen plans and builds the target within your own cloud account as part of the written scope.
Why must MySQL be removed after moving Mattermost to PostgreSQL?
MySQL can no longer be the database for current Mattermost releases. Mattermost's upgrade notes state that support for MySQL ended with v11.0, and it made PostgreSQL its database of choice from v8.0. A team that upgrades past v11.0 without moving to PostgreSQL cannot continue on MySQL. For that reason, the migration should be planned alongside any server upgrade, so the database move and the release change are sequenced correctly. Confirm the exact upgrade path and the release you plan to run with Mattermost before setting a schedule, and document the retirement of the MySQL server as part of the decommissioning work.
What happens if the trial migration fails?
A failed trial run leaves production untouched, because Mattermost recommends running the migration against a copy of the MySQL database on a separate server. The team investigates the error, corrects the cause (for example, a configuration, plugin or data issue), and runs the migration again on a fresh copy. Each rerun adds time, so the number of trial runs should be part of the scope and the quote. Ask how failures are logged, how the team agrees on a go or no-go decision, and what the rollback plan requires. DeployOpen documents every trial run and its results so your team can review the cause before the next attempt.
How DeployOpen scopes, delivers and supports the Mattermost database move
DeployOpen approaches Migrate Mattermost from MySQL to PostgreSQL as a fixed-scope engagement in infrastructure you control. The work starts from a written scope covering sizing, a trial run against a copy of your database, and plugin data for Boards, Playbooks and Calls.
How we scope
- The written scope names the source MySQL version, the Mattermost server version and the target PostgreSQL major version.
- It records whether migration-assist or a manual pgloader process fits your database, and why.
- Sizing covers the MySQL database and the 2 CPU cores and 16 GB RAM recommended for migration-assist.
How we build
- Migration runs on a separate server against a copy of the MySQL database, not on the live production instance.
- The PostgreSQL server starts at the same size as the MySQL server, then is adjusted based on trial run measurements.
- Plugin data for Boards, Playbooks and Calls is migrated and checked in the same trial run as core data.
How we hand over
- Handover includes a runbook with the cutover steps, rollback point and the verification checks used in the trial run.
- Your team receives the PostgreSQL configuration, connection settings and backup procedure for the new database.
- Documentation records the MySQL source, the target version and each check, so the migration can be reviewed later.
How we support
- If agreed in the scope, post-cutover support covers early issues, backups and PostgreSQL operations.
- Ongoing support, upgrades and continuous testing are available as a retainer after the migration is complete.
- Mattermost ended MySQL support with v11.0, so the move keeps your server on a supported database.

