Automattic/studio

Impossible to move to the MySQL

Closed this issue ยท 7 comments

Quick summary

I have tried to dump SQLite to .sql file and then import with Adminer at my host, and it doesn't work. I also tried SQLstudio as it is written in the docs.

I also tried popular migration plugins which doesn't work at all โ”€ UpDraft Plus, WP Vivid Backup, WP All in one migration, Duplicator.

So I am currently lost, because I can't move the site from localhost to the production.

Steps to reproduce

  1. Install Studio, create website
  2. Go to wp-content/database
  3. run sqlite3 .ht.sqlite .dump > dump.sql
  4. upload adminer.php to running host
  5. import dump.sql
    --> FAIL

What you expected to happen

The database should be migrated to MySQL host.

What actually happened

It crashed with error. I tried to debug with chatGPT, but It was too much errors.

Impact

All

Available workarounds?

No but the app is still usable

Platform

Windows

Logs or notes

Here are some of the errors:
1.
Chyba v dotazu (1064): Syntax error near 'PRAGMA foreign_keys=OFF' at line 1

CREATE TABLE _mysql_data_types_cache (
table TEXT PRIMARY KEY NOT NULL,
column_or_index TEXT PRIMARY KEY NOT NULL,
mysql_type TEXT NOT NULL
)
Chyba v dotazu (1068): Multiple primary key defined

INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_content, post_title, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count) VALUES ('30', '1', '2024-05-21 21:39:20', '2024-05-21 19:39:20', '{
"show_on_front": {
"value": "page",
"type": "option",
"user_id": 1,
"date_modified_gmt": "2024-05-21 19:39:20"
},
"page_on_front": {
"value": "28",
"type": "option",
"user_id": 1,
"date_modified_gmt": "2024-05-21 19:39:20"
}
}', '', '', 'trash', 'closed', 'closed', '', '82761ffc-3f43-4d73-b3c1-841aa22039b5', '', '', '2024-05-21 21:39:20', '2024-05-21 19:39:20', '', '0', 'https://proka.alessykora.cz:8881/?p=30', '0', 'customize_changeset', '', '0')
Chyba v dotazu (1406): Data too long for column 'post_content' at row 1

INSERT INTO wp_actionscheduler_actions (action_id, hook, status, scheduled_date_gmt, scheduled_date_local, priority, args, schedule, group_id, attempts, last_attempt_gmt, last_attempt_local, claim_id, extended_args) VALUES ('115', 'instawp_send_heartbeat', 'complete', '2024-05-27 12:15:19', '2024-05-27 14:15:19', '10', '[]', 'O:32:"ActionScheduler_IntervalSchedule":5:{s:22:"โ€ฆ
Chyba v dotazu (1406): Data too long for column 'schedule' at row 1

WP CLI (wp db export) also doesn't work.

Spent hours yesterday trying to convert the db without success. So +1 on this!

Here's the debug.log entry after activating duplicator:

[27-May-2024 16:05:33 UTC] PHP Fatal error:  Uncaught TypeError: mysqli_real_escape_string(): Argument #1 ($mysql) must be of type mysqli, WP_SQLite_Translator given in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php:342
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.db.php(342): mysqli_real_escape_string(Object(WP_SQLite_Translator), '\x00\x1A\r\n'"\\')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(56): DUP_DB::escValueToQueryString('\x00\x1A\r\n'"\\')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(123): DUP_Server::mysqlEscapeIsOk()
#3 /var/www/html/wp-content/plugins/duplicator/views/packages/main/s1.setup1.php(21): DUP_Server::getRequirements()
#4 /var/www/html/wp-content/plugins/duplicator/views/packages/main/controller.php(64): include('/var/www/html/w...')
#5 /var/www/html/wp-content/plugins/duplicator/views/packages/controller.php(72): include('/var/www/html/w...')
#6 /var/www/html/wp-content/plugins/duplicator/src/Core/Bootstrap.php(265): include('/var/www/html/w...')
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Duplicator\Core\Bootstrap::Duplicator\Core\{closure}('')
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#10 /var/www/html/wp-admin/admin.php(259): do_action('toplevel_page_d...')
#11 {main}
  thrown in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php on line 342
[27-May-2024 16:05:33 UTC] [PHP ERR][FATAL] MSG:Uncaught TypeError: mysqli_real_escape_string(): Argument #1 ($mysql) must be of type mysqli, WP_SQLite_Translator given in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php:342
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.db.php(342): mysqli_real_escape_string(Object(WP_SQLite_Translator), '\x00\x1A\r\n'"\\')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(56): DUP_DB::escValueToQueryString('\x00\x1A\r\n'"\\')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(123): DUP_Server::mysqlEscapeIsOk()
#3 /var/www/html/wp-content/plugins/duplicator/views/packages/main/s1.setup1.php(21): DUP_Server::getRequirements()
#4 /var/www/html/wp-content/plugins/duplicator/views/packages/main/controller.php(64): include('/var/www/html/w...')
#5 /var/www/html/wp-content/plugins/duplicator/views/packages/controller.php(72): include('/var/www/html/w...')
#6 /var/www/html/wp-content/plugins/duplicator/src/Core/Bootstrap.php(265): include('/var/www/html/w...')
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Duplicator\Core\Bootstrap::Duplicator\Core\{closure}('')
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#10 /var/www/html/wp-admin/admin.php(259): do_action('toplevel_page_d...')
#11 {main}
  thrown [CODE:1|FILE:/var/www/html/wp-content/plugins/duplicator/classes/class.db.php|LINE:342]
DUP_Handler::shutdown, DUP_Handler::error, DUP_Handler::getMessage DETAIL:
[27-May-2024 16:05:33 UTC] PHP Fatal error:  Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, null given in /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php:296
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(296): fwrite(NULL, '\n==============...')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(445): DUP_Log::error('[PHP ERR][FATAL...')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(555): DUP_Handler::error(1, 'Uncaught TypeEr...', '/var/www/html/w...', 342)
#3 [internal function]: DUP_Handler::shutdown()
#4 {main}
  thrown in /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php on line 296
[27-May-2024 16:05:33 UTC] WordPress database error <div style="clear:both">&nbsp;</div>
<div class="queries" style="clear:both;margin-bottom:2px;border:red dotted thin;">
<p>MySQL query:</p>
<p>SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 3</p>
<p>Queries made or created this session were:</p>
<ol>
<li>Executing: BEGIN | (no parameters)</li>
<li>Executing: SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 3 | (no parameters)</li>
<li>Executing: ROLLBACK | (no parameters)</li>
</ol>
</div>
<div style="clear:both;margin-bottom:2px;border:red dotted thin;" class="error_message" style="border-bottom:dotted blue thin;">
Error occurred at line 3775 in Function <code>handle_error</code>. Error message was: SQLSTATE[HY000]: General error: 1 no such column: HOUR.
</div>
<p>Backtrace:</p>
<pre>#0 /var/www/html/wp-content/mu-plugins/sqlite-database-integration-main/wp-includes/sqlite/class-wp-sqlite-db.php(287): WP_SQLite_Translator->get_error_message()
#1 /var/www/html/wp-includes/class-wpdb.php(3031): WP_SQLite_DB->query('SELECT TIMESTAM...')
#2 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/model/download_intent_clean.php(46): wpdb->get_var('SELECT TIMESTAM...')
#3 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/download_timed_aggregator_job.php(156): Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours('3')
#4 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/job_trait.php(161): Podlove\Jobs\DownloadTimedAggregatorJob->do_step()
#5 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(163): Podlove\Jobs\DownloadTimedAggregatorJob->step()
#6 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(87): Podlove\Jobs\CronJobRunner::run_job('14', 1716825933)
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Podlove\Jobs\CronJobRunner::work_jobs()
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#10 /var/www/html/wp-cron.php(191): do_action_ref_array('cron_job_worker', Array)
#11 {main}</pre>
 for query SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 3 made by do_action_ref_array('cron_job_worker'), WP_Hook->do_action, WP_Hook->apply_filters, Podlove\Jobs\CronJobRunner::work_jobs, Podlove\Jobs\CronJobRunner::run_job, Podlove\Jobs\DownloadTimedAggregatorJob->step, Podlove\Jobs\DownloadTimedAggregatorJob->do_step, Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours, WP_SQLite_DB->query, WP_SQLite_DB->print_error
[27-May-2024 16:05:33 UTC] WordPress database error <div style="clear:both">&nbsp;</div>
<div class="queries" style="clear:both;margin-bottom:2px;border:red dotted thin;">
<p>MySQL query:</p>
<p>SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 4</p>
<p>Queries made or created this session were:</p>
<ol>
<li>Executing: BEGIN | (no parameters)</li>
<li>Executing: SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 4 | (no parameters)</li>
<li>Executing: ROLLBACK | (no parameters)</li>
</ol>
</div>
<div style="clear:both;margin-bottom:2px;border:red dotted thin;" class="error_message" style="border-bottom:dotted blue thin;">
Error occurred at line 3775 in Function <code>handle_error</code>. Error message was: SQLSTATE[HY000]: General error: 1 no such column: HOUR.
</div>
<p>Backtrace:</p>
<pre>#0 /var/www/html/wp-content/mu-plugins/sqlite-database-integration-main/wp-includes/sqlite/class-wp-sqlite-db.php(287): WP_SQLite_Translator->get_error_message()
#1 /var/www/html/wp-includes/class-wpdb.php(3031): WP_SQLite_DB->query('SELECT TIMESTAM...')
#2 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/model/download_intent_clean.php(46): wpdb->get_var('SELECT TIMESTAM...')
#3 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/download_timed_aggregator_job.php(156): Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours('4')
#4 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/job_trait.php(161): Podlove\Jobs\DownloadTimedAggregatorJob->do_step()
#5 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(163): Podlove\Jobs\DownloadTimedAggregatorJob->step()
#6 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(87): Podlove\Jobs\CronJobRunner::run_job('14', 1716825933)
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Podlove\Jobs\CronJobRunner::work_jobs()
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#10 /var/www/html/wp-cron.php(191): do_action_ref_array('cron_job_worker', Array)
#11 {main}</pre>
 for query SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 4 made by do_action_ref_array('cron_job_worker'), WP_Hook->do_action, WP_Hook->apply_filters, Podlove\Jobs\CronJobRunner::work_jobs, Podlove\Jobs\CronJobRunner::run_job, Podlove\Jobs\DownloadTimedAggregatorJob->step, Podlove\Jobs\DownloadTimedAggregatorJob->do_step, Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours, WP_SQLite_DB->query, WP_SQLite_DB->print_error
[27-May-2024 16:05:33 UTC] WordPress database error <div style="clear:both">&nbsp;</div>
<div class="queries" style="clear:both;margin-bottom:2px;border:red dotted thin;">
<p>MySQL query:</p>
<p>SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 6</p>
<p>Queries made or created this session were:</p>
<ol>
<li>Executing: BEGIN | (no parameters)</li>
<li>Executing: SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 6 | (no parameters)</li>
<li>Executing: ROLLBACK | (no parameters)</li>
</ol>
</div>
<div style="clear:both;margin-bottom:2px;border:red dotted thin;" class="error_message" style="border-bottom:dotted blue thin;">
Error occurred at line 3775 in Function <code>handle_error</code>. Error message was: SQLSTATE[HY000]: General error: 1 no such column: HOUR.
</div>
<p>Backtrace:</p>
<pre>#0 /var/www/html/wp-content/mu-plugins/sqlite-database-integration-main/wp-includes/sqlite/class-wp-sqlite-db.php(287): WP_SQLite_Translator->get_error_message()
#1 /var/www/html/wp-includes/class-wpdb.php(3031): WP_SQLite_DB->query('SELECT TIMESTAM...')
#2 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/model/download_intent_clean.php(46): wpdb->get_var('SELECT TIMESTAM...')
#3 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/download_timed_aggregator_job.php(156): Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours('6')
#4 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/job_trait.php(161): Podlove\Jobs\DownloadTimedAggregatorJob->do_step()
#5 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(163): Podlove\Jobs\DownloadTimedAggregatorJob->step()
#6 /var/www/html/wp-content/plugins/podlove-podcasting-plugin-for-wordpress/lib/jobs/cron_job_runner.php(87): Podlove\Jobs\CronJobRunner::run_job('14', 1716825933)
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Podlove\Jobs\CronJobRunner::work_jobs()
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#10 /var/www/html/wp-cron.php(191): do_action_ref_array('cron_job_worker', Array)
#11 {main}</pre>
 for query SELECT TIMESTAMPDIFF(HOUR, p.post_date, NOW())
				FROM `wp_podlove_episode` e
				JOIN `wp_posts` p ON p.ID = e.`post_id`
				WHERE e.id = 6 made by do_action_ref_array('cron_job_worker'), WP_Hook->do_action, WP_Hook->apply_filters, Podlove\Jobs\CronJobRunner::work_jobs, Podlove\Jobs\CronJobRunner::run_job, Podlove\Jobs\DownloadTimedAggregatorJob->step, Podlove\Jobs\DownloadTimedAggregatorJob->do_step, Podlove\Model\DownloadIntentClean::actual_episode_age_in_hours, WP_SQLite_DB->query, WP_SQLite_DB->print_error
[27-May-2024 16:12:47 UTC] PHP Fatal error:  Uncaught TypeError: mysqli_real_escape_string(): Argument #1 ($mysql) must be of type mysqli, WP_SQLite_Translator given in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php:342
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.db.php(342): mysqli_real_escape_string(Object(WP_SQLite_Translator), '\x00\x1A\r\n'"\\')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(56): DUP_DB::escValueToQueryString('\x00\x1A\r\n'"\\')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(123): DUP_Server::mysqlEscapeIsOk()
#3 /var/www/html/wp-content/plugins/duplicator/views/packages/main/s1.setup1.php(21): DUP_Server::getRequirements()
#4 /var/www/html/wp-content/plugins/duplicator/views/packages/main/controller.php(64): include('/var/www/html/w...')
#5 /var/www/html/wp-content/plugins/duplicator/views/packages/controller.php(72): include('/var/www/html/w...')
#6 /var/www/html/wp-content/plugins/duplicator/src/Core/Bootstrap.php(265): include('/var/www/html/w...')
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Duplicator\Core\Bootstrap::Duplicator\Core\{closure}('')
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#10 /var/www/html/wp-admin/admin.php(259): do_action('toplevel_page_d...')
#11 {main}
  thrown in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php on line 342
[27-May-2024 16:12:47 UTC] [PHP ERR][FATAL] MSG:Uncaught TypeError: mysqli_real_escape_string(): Argument #1 ($mysql) must be of type mysqli, WP_SQLite_Translator given in /var/www/html/wp-content/plugins/duplicator/classes/class.db.php:342
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.db.php(342): mysqli_real_escape_string(Object(WP_SQLite_Translator), '\x00\x1A\r\n'"\\')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(56): DUP_DB::escValueToQueryString('\x00\x1A\r\n'"\\')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.server.php(123): DUP_Server::mysqlEscapeIsOk()
#3 /var/www/html/wp-content/plugins/duplicator/views/packages/main/s1.setup1.php(21): DUP_Server::getRequirements()
#4 /var/www/html/wp-content/plugins/duplicator/views/packages/main/controller.php(64): include('/var/www/html/w...')
#5 /var/www/html/wp-content/plugins/duplicator/views/packages/controller.php(72): include('/var/www/html/w...')
#6 /var/www/html/wp-content/plugins/duplicator/src/Core/Bootstrap.php(265): include('/var/www/html/w...')
#7 /var/www/html/wp-includes/class-wp-hook.php(324): Duplicator\Core\Bootstrap::Duplicator\Core\{closure}('')
#8 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)
#9 /var/www/html/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#10 /var/www/html/wp-admin/admin.php(259): do_action('toplevel_page_d...')
#11 {main}
  thrown [CODE:1|FILE:/var/www/html/wp-content/plugins/duplicator/classes/class.db.php|LINE:342]
DUP_Handler::shutdown, DUP_Handler::error, DUP_Handler::getMessage DETAIL:
[27-May-2024 16:12:47 UTC] PHP Fatal error:  Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, null given in /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php:296
Stack trace:
#0 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(296): fwrite(NULL, '\n==============...')
#1 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(445): DUP_Log::error('[PHP ERR][FATAL...')
#2 /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php(555): DUP_Handler::error(1, 'Uncaught TypeEr...', '/var/www/html/w...', 342)
#3 [internal function]: DUP_Handler::shutdown()
#4 {main}
  thrown in /var/www/html/wp-content/plugins/duplicator/classes/class.logging.php on line 296

Thanks for the report! @sejas is looking into a better solution for this.

Thanks for the report! @sejas is looking into a better solution for this.

Thank you very much!

@AlkoKod I had a positive experience with the All in One WP Migration plugin for importing and exporting Studio sites.

I see you mentioned that it didn't work for you. Could you share more details?

Hello @wojtekn unfortunatelly, I already deleted the site a start the develop process with other solution. It cost me a lot of time and money (i know, it is beta, it shouldn't be used for agency work lol). So I am not able to tell anymore.

We've just released Studio 1.1.0, which supports importing and exporting the site, as well as the database dump only.