Symptoms: Test API returns a
network error or timeout (e.g. WinHTTP
12029 — cannot connect or
12007 — name not resolved).
{"success":false,"message":"No action specified"}. An HTML
error page or connection refused means the URL or server is the
problem.edbapi.php
(e.g. https://example.com/edbapi.php).Symptoms: All actions fail with HTTP 401.
Check API_KEY in config.php. Enter the
matching value in the API Key field on the
Remote Configuration tab. If API_KEY is
intentionally empty, leave the application field blank.
Symptoms: Test DB returns an error;
log shows HTTP 400 — Connection failed: ... with a PDO
error.
SELECT, INSERT, UPDATE,
CREATE, DROP, ALTER) on the
target database.edb2mysql-api.log on the server for the full PDO
error (located in private/ alongside
config.php, or wherever LOG_FILE is defined in
config.php).Symptoms: All actions fail with HTTP 403.
Add the client machine’s IP to ALLOWED_IPS in
config.php, or set ALLOWED_IPS to
[] to allow all IPs.
Symptoms: Log shows [E4004] with an
excerpt of the unexpected response body; or a related code such as
[E4002] (timeout) or [E1018] (memory limit)
with an actionable hint.
The application classifies non-JSON server responses automatically. Many common cases produce a specific code and message:
| What the server returned | Log code | Log message |
|---|---|---|
| HTTP 408 or HTTP 504 | E4002 | HTTP timeout — use LIMIT or increase max_execution_time |
PHP max_execution_time exceeded |
E4002 | PHP max_execution_time exceeded — use LIMIT or increase max_execution_time in php.ini |
PHP memory_limit exceeded |
E1018 | PHP memory_limit exceeded — use LIMIT or increase memory_limit in php.ini |
| Truncated JSON (server killed mid-response) | E4002 | server response was truncated — use LIMIT or increase limits |
| Unrecognised body | E4004 | plain-text excerpt of the response |
When E4004 appears, the log message includes an HTML-stripped excerpt of the body. If that does not identify the cause:
edbapi.php and config.php are
syntactically valid.pdo_mysql PHP extension is installed
and enabled.Symptoms: Log shows
WARNING: Table X: batch send failed — N row(s) at offset Y..Z not inserted.
On servers running PHP v175 or later, the warning also includes
[row: col=val, ...] identifying the specific row that
triggered the server-side error (PK columns when the table has a primary
key; otherwise all non-BLOB columns). Use this to locate the problematic
value in the source EDB table.
Causes: The web server returned an error page (503,
502) instead of a PHP response; or API_ENABLED = false in
config.php.
pm.max_children (PHP-FPM) or
equivalent.Cause: The table has no primary key. Re-running migration inserts all rows again — no unique constraint exists for conflict detection.
Truncate the target table before re-running (via the SQL Console or Reset selected). The Pre-Migration Analysis dialog flags tables without a primary key as a Warning.
Cause: No primary key. Without a PK, EDB does not
guarantee the same row order between separate SELECT
executions. The resume mechanism skips rows by offset count, not by row
identity — different rows may be fetched at the same offset if physical
order changed.
Truncate the target table and restart migration for the affected table. Adding a PK to the EDB table eliminates this problem.
Cause: The DDL script contains many statements or slow operations that exceed the web server’s gateway timeout.
fastcgi_read_timeout (nginx) or ProxyTimeout
(Apache) to at least 300 seconds.| Cause | Remedy |
|---|---|
| One or more batches failed | Check the log for
batch send failed; click Start / Resume to
retry. |
| No PK — migration re-run without resetting | Truncate the target table and restart. |
| MySQL strict mode rejected rows that EDB accepted silently | See below. |
| Debug mode was active | Run a full migration with Debug Mode disabled. |
Symptoms: Log shows batch send failed;
Remote Configuration panel shows Strict: Yes; server
log shows Data too long for column or
Out of range value for column.
Cause: STRICT_TRANS_TABLES or
STRICT_ALL_TABLES is active. EDB silently accepts values
that strict mode rejects.
edb2mysql-api.log (in private/
alongside config.php) for the column name and offending
value.SYSTEM_VARIABLES_ADMIN privileges, disable
strict mode via the SQL Console for the duration of the migration:-- Disable strict mode (restore original value after migration)
SET GLOBAL sql_mode = REPLACE(@@GLOBAL.sql_mode, 'STRICT_TRANS_TABLES', '');
SET GLOBAL sql_mode = REPLACE(@@GLOBAL.sql_mode, 'STRICT_ALL_TABLES', '');Cause: The table has no primary key. Without a PK, BLOB values above the inline threshold are written as NULL by design (flagged as a Warning by the Pre-Migration Analysis dialog).
Add a primary key to the EDB table before migration.
Symptoms: Log shows ERROR [E4001]
(connection failed) or ERROR [E4002] (timed out) on action
blob_commit, followed by
WARNING: Abandoned blob_commit session (UUID=...); partial server file auto-removed within 48 h.
The affected BLOB column is NULL in MySQL.
Cause: The web server’s FastCGI/proxy read timeout
expired while PHP was executing the MySQL UPDATE. The web
server closed the connection before PHP sent the JSON reply.
UPDATE using a MySQL client tool.fastcgi_read_timeout
(nginx) or ProxyTimeout (Apache) to at least 300
seconds.Cause: The cell exceeded Max KB in the SQL Console toolbar.
Click Download Full Content in the BLOB viewer. If the button is not visible (no PK columns in the result, or aliased column), increase Max KB and re-run the query.
Cause: PHP ran out of memory while fetching a row
with a large BLOB, or the BLOB exceeded
MAX_RESULT_BUFFER_MB in config.php.
Add a WHERE clause to reduce the result set, or increase
MAX_RESULT_BUFFER_MB in config.php. Check the
server-side log for PDO buffer overflow errors.
Symptoms: After querying a table that has CLOB
columns, some fields show unreadable content such as
dGVzdCBzdHJpbmc= or similar Base64-encoded strings instead
of the expected text. Only affects values that exceeded the OOB
KB threshold (visible in the SQL Console toolbar, or the
InlineBlobMaxBytes property in the library).
Cause: A bug in EDBMMUtils v16 and earlier: CLOB cells stored as server-side temp files (values exceeding the OOB threshold) were written to the local EDB field as the raw Base64 string instead of the decoded text. Binary BLOB columns were not affected — only text CLOB columns. Fixed in EDBMMUtils v17.
Remedy: - In the SQL Console:
re-run the query that produced the result. The current version decodes
OOB CLOB values correctly. - In the library
(TMMScript.Execute), if you are using an assigned
Table that persists across calls: re-run
Execute to overwrite the affected rows with correct values.
If the table was populated by code using EDBMMUtils v16 or earlier,
identify affected rows by checking CLOB fields for Base64 patterns
(letters, digits, +, /, and =
padding only, no spaces or punctuation).
Symptoms: Log shows [E4001] (connection
failed) or [E4002] (timed out) during data migration of a
table with BLOB/CLOB columns. Migration may stop or report the batch as
failed.
Cause: A network error or timeout occurred while uploading a BLOB chunk to the server (the binary data is sent in pieces via HTTP multipart). This is a transport failure, not a PHP-level error.
fastcgi_read_timeout (nginx) or ProxyTimeout
(Apache) — see the Server Configuration Checklist
below.Note: If the log shows
[E4006](HTTP multipart upload failed) rather than E4001/E4002, the chunk reached the server but was rejected — checkupload_max_filesizeandpost_max_sizeinphp.ini.
Cause: A BLOB chunk upload was in progress when migration was aborted; the partially assembled temp file was not deleted.
Manually delete the blobuploads/ directory inside the
configuration folder (the private/ folder containing
config.php) via FTP/SFTP or a file manager.
Note: the server-side log file (
edb2mysql-api.log) and the_tmp/directory for script and result temp files are also located in this configuration folder (outside the webroot), not inside thePHP/webroot folder. If you upgraded from a version older than v184 ofedbapi.phpwithout aLOG_FILEdefinition, a staleedb2mysql-api.logmay still exist atPHP/edb2mysql-api.log— it can be safely deleted. The directory is recreated automatically on the next migration.
Alternatively, if you have HTTP access to the API, send
action=blob_cleanup to delete all files under
blobuploads/ programmatically — for example from the SQL
Console using a REST client, or via a direct HTTP POST:
{ "action": "blob_cleanup" }Minimum recommended configuration for reliable migration of databases with large BLOBs:
| Setting | Location | Recommended value |
|---|---|---|
fastcgi_read_timeout |
nginx vhost | ≥ 300 s |
ProxyTimeout / Timeout |
Apache vhost | ≥ 300 s |
max_execution_time |
php.ini / .user.ini |
3600 or 0 |
max_input_time |
php.ini only |
3600 or -1 |
post_max_size |
php.ini / .user.ini |
≥ 64 MB |
upload_max_filesize |
php.ini / .user.ini |
≥ 64 MB |
memory_limit |
php.ini |
≥ 256 MB |
max_allowed_packet |
MySQL server | ≥ 64 MB |
max_input_timeis evaluated before any PHP code runs and cannot be changed viaini_set. It must be set inphp.inior an.htaccessphp_valuedirective.
The application reads post_max_size,
upload_max_filesize, and memory_limit from the
server after connection and configures BLOB and batch limits
automatically.