前言
由于迁移系统, 对MySQL
存储的数据进行迁移, 使用MySQL
自带的mysqldump
命令进行数据迁移.
mysqldump -hlocalhost -uroot -ppass database_name > d:/backupfile.sql
使用mysqldump
备份好数据后, 由于数据量较大, 为保障万无一失, 使用navicat
进行了额外的增量备份(navicat
备份数据, 生成的文件更小).
注: 备份数据, 注意安全冗余.
问题
恢复数据, 使用source
命令
d:
source backupfile.sql
ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: ''.
-- 添加该参数, 依然还是会出现错误.
I have tried putting
--binary-mode
in the ini file but it still gives the same error. What should I do? Please help.
问题出现, 出现了编码的异常, 同时还有报 Error 22
错误, can't open file
.
查询一下, stackflow
有相关的问题.
这里隐藏着powershell
的一个潜在坑, powershell
默认使用的编码类型是utf-16
The problem comes from the default encoding of powershell is UTF16. To look deeper into this, we can use "file" utility of GNU, and there exists a windows version here.
The output of my dump file is:
注: notepad++, 打开大型的文本, 注意卡顿
在mysql
的文档中, 也提及了这个问题
A dump made using PowerShell on Windows with output redirection creates a file that has UTF-16 encoding:
However, UTF-16 is not permitted as a connection character set (see Impermissible Client Character Sets), so the dump file cannot be loaded correctly. To work around this issue, use the
--result-file
option, which creates the output in ASCII format:
同时也需要注意这个问题, 在powershell
执行输出结果到文本时.
进一步延申应该和Windows上编码问题unicode - Why does Windows use UTF-16LE? - Stack Overflow
Windows was one of the first Operating Systems to adopt Unicode. Back then, there was indeed no UTF-8 yet, and UCS-2 was the most common encoding used for Unicode. So Windows' initial Unicode support was based on UCS-2.
By the time Unicode outgrew UCS-2, and UTF-8 and UTF-16 became more popular, it was too late for Windows to change over to UTF-8 without breaking tons of existing code 1, however UTF-16 is backwards compatible with UCS-2, so Microsoft was able to switch to UTF-16 with minimal effort, and little-to-no changes to existing user code.
1: and now, 20-odd years later, in Windows 10, Microsoft is only just starting to really begin to support UTF-8 at the Win32 API layer, but that functionality is still experimental, has to be enabled manually by the user or on a per-application basis via app manifests, and typically requires changes to user code to take advantage of UTF8-enabled APIs rather than UTF16-based APIs.
windows10
上utf-8
的支持, 该特性还处于beta
状态.
解决
根据上述的文档, 调整mysqldump
命令的参数.
注: 这里的utf-8
和mysql
utf8mb4
完全一致?.
mysqldump -hlocalhost -uroot -pMySQL@2022 --default-character-set=UTF8 --databases test_logistics --hex-blob --result-file=C:\Users\Lian\Desktop\backupfile_utf_8.sql
--default-character-set=UTF8
, 指定字符编码
--hex-blob
Dump binary columns using hexadecimal notation (for example,
'abc'
becomes0x616263
). The affected data types areBINARY
,VARBINARY
,BLOB
types,BIT
, all spatial data types, and other non-binary data types when used with thebinary
character set.
--result-file
Direct output to the named file. The result file is created and its previous contents overwritten, even if an error occurs while generating the dump.This option should be used on Windows to prevent newline
\n
characters from being converted to\r\n
carriage return/newline sequences.
针对windows的专用命令
其他
powershell
和cmd
在cd
命令上的差异
powershell
字符集相关, URL
mysqldump
参数:
Option Name | Description | Introduced | Deprecated | 作用 |
---|---|---|---|---|
--add-drop-database | Add DROP DATABASE statement before each CREATE DATABASE statement | 删除数据库 | ||
--add-drop-table | Add DROP TABLE statement before each CREATE TABLE statement | 删除表 | ||
--add-drop-trigger | Add DROP TRIGGER statement before each CREATE TRIGGER statement | 删除触发器 | ||
--add-locks | Surround each table dump with LOCK TABLES and UNLOCK TABLES statements | 备份时锁表 | ||
--all-databases | Dump all tables in all databases | |||
--allow-keywords | Allow creation of column names that are keywords | |||
--apply-replica-statements | Include STOP REPLICA prior to CHANGE REPLICATION SOURCE TO statement and START REPLICA at end of output | 8.0.26 | ||
--apply-slave-statements | Include STOP SLAVE prior to CHANGE MASTER statement and START SLAVE at end of output | 8.0.26 | ||
--bind-address | Use specified network interface to connect to MySQL Server | |||
--character-sets-dir | Directory where character sets are installed | |||
--column-statistics | Write ANALYZE TABLE statements to generate statistics histograms | |||
--comments | Add comments to dump file | |||
--compact | Produce more compact output | |||
--compatible | Produce output that is more compatible with other database systems or with older MySQL servers | |||
--complete-insert | Use complete INSERT statements that include column names | |||
--compress | Compress all information sent between client and server | 8.0.18 | ||
--compression-algorithms | Permitted compression algorithms for connections to server | 8.0.18 | ||
--create-options | Include all MySQL-specific table options in CREATE TABLE statements | |||
--databases | Interpret all name arguments as database names | |||
--debug | Write debugging log | |||
--debug-check | Print debugging information when program exits | |||
--debug-info | Print debugging information, memory, and CPU statistics when program exits | |||
--default-auth | Authentication plugin to use | |||
--default-character-set | Specify default character set | |||
--defaults-extra-file | Read named option file in addition to usual option files | |||
--defaults-file | Read only named option file | |||
--defaults-group-suffix | Option group suffix value | |||
--delete-master-logs | On a replication source server, delete the binary logs after performing the dump operation | 8.0.26 | ||
--delete-source-logs | On a replication source server, delete the binary logs after performing the dump operation | 8.0.26 | ||
--disable-keys | For each table, surround INSERT statements with statements to disable and enable keys | |||
--dump-date | Include dump date as "Dump completed on" comment if --comments is given | |||
--dump-replica | Include CHANGE REPLICATION SOURCE TO statement that lists binary log coordinates of replica's source | 8.0.26 | ||
--dump-slave | Include CHANGE MASTER statement that lists binary log coordinates of replica's source | 8.0.26 | ||
--enable-cleartext-plugin | Enable cleartext authentication plugin | |||
--events | Dump events from dumped databases | |||
--extended-insert | Use multiple-row INSERT syntax | |||
--fields-enclosed-by | This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA | |||
--fields-escaped-by | This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA | |||
--fields-optionally-enclosed-by | This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA | |||
--fields-terminated-by | This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA | |||
--flush-logs | Flush MySQL server log files before starting dump | |||
--flush-privileges | Emit a FLUSH PRIVILEGES statement after dumping mysql database | |||
--force | Continue even if an SQL error occurs during a table dump | |||
--get-server-public-key | Request RSA public key from server | |||
--help | Display help message and exit | |||
--hex-blob | Dump binary columns using hexadecimal notation | |||
--host | Host on which MySQL server is located | |||
--ignore-error | Ignore specified errors | |||
--ignore-table | Do not dump given table | |||
--include-master-host-port | Include MASTER_HOST/MASTER_PORT options in CHANGE MASTER statement produced with --dump-slave | 8.0.26 | ||
--include-source-host-port | Include SOURCE_HOST and SOURCE_PORT options in CHANGE REPLICATION SOURCE TO statement produced with --dump-replica | 8.0.26 | ||
--insert-ignore | Write INSERT IGNORE rather than INSERT statements | |||
--lines-terminated-by | This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA | |||
--lock-all-tables | Lock all tables across all databases | |||
--lock-tables | Lock all tables before dumping them | |||
--log-error | Append warnings and errors to named file | |||
--login-path | Read login path options from .mylogin.cnf | |||
--master-data | Write the binary log file name and position to the output | 8.0.26 | ||
--max-allowed-packet | Maximum packet length to send to or receive from server | |||
--mysqld-long-query-time | Session value for slow query threshold | 8.0.30 | ||
--net-buffer-length | Buffer size for TCP/IP and socket communication | |||
--network-timeout | Increase network timeouts to permit larger table dumps | |||
--no-autocommit | Enclose the INSERT statements for each dumped table within SET autocommit = 0 and COMMIT statements | |||
--no-create-db | Do not write CREATE DATABASE statements | |||
--no-create-info | Do not write CREATE TABLE statements that re-create each dumped table | |||
--no-data | Do not dump table contents | |||
--no-defaults | Read no option files | |||
--no-set-names | Same as --skip-set-charset | |||
--no-tablespaces | Do not write any CREATE LOGFILE GROUP or CREATE TABLESPACE statements in output | |||
--opt | Shorthand for --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset | |||
--order-by-primary | Dump each table's rows sorted by its primary key, or by its first unique index | |||
--password | Password to use when connecting to server | |||
--password1 | First multifactor authentication password to use when connecting to server | 8.0.27 | ||
--password2 | Second multifactor authentication password to use when connecting to server | 8.0.27 | ||
--password3 | Third multifactor authentication password to use when connecting to server | 8.0.27 | ||
--pipe | Connect to server using named pipe (Windows only) | |||
--plugin-dir | Directory where plugins are installed | |||
--port | TCP/IP port number for connection | |||
--print-defaults | Print default options | |||
--protocol | Transport protocol to use | |||
--quick | Retrieve rows for a table from the server a row at a time | |||
--quote-names | Quote identifiers within backtick characters | |||
--replace | Write REPLACE statements rather than INSERT statements | |||
--result-file | Direct output to a given file | |||
--routines | Dump stored routines (procedures and functions) from dumped databases | |||
--server-public-key-path | Path name to file containing RSA public key | |||
--set-charset | Add SET NAMES default_character_set to output | |||
--set-gtid-purged | Whether to add SET @@GLOBAL.GTID_PURGED to output | |||
--shared-memory-base-name | Shared-memory name for shared-memory connections (Windows only) | |||
--show-create-skip-secondary-engine | Exclude SECONDARY ENGINE clause from CREATE TABLE statements | 8.0.18 | ||
--single-transaction | Issue a BEGIN SQL statement before dumping data from server | |||
--skip-add-drop-table | Do not add a DROP TABLE statement before each CREATE TABLE statement | |||
--skip-add-locks | Do not add locks | |||
--skip-comments | Do not add comments to dump file | |||
--skip-compact | Do not produce more compact output | |||
--skip-disable-keys | Do not disable keys | |||
--skip-extended-insert | Turn off extended-insert | |||
--skip-generated-invisible-primary-key | Do not include generated invisible primary keys in dump file | 8.0.30 | ||
--skip-opt | Turn off options set by --opt | |||
--skip-quick | Do not retrieve rows for a table from the server a row at a time | |||
--skip-quote-names | Do not quote identifiers | |||
--skip-set-charset | Do not write SET NAMES statement | |||
--skip-triggers | Do not dump triggers | |||
--skip-tz-utc | Turn off tz-utc | |||
--socket | Unix socket file or Windows named pipe to use | |||
--source-data | Write the binary log file name and position to the output | 8.0.26 | ||
--ssl-ca | File that contains list of trusted SSL Certificate Authorities | |||
--ssl-capath | Directory that contains trusted SSL Certificate Authority certificate files | |||
--ssl-cert | File that contains X.509 certificate | |||
--ssl-cipher | Permissible ciphers for connection encryption | |||
--ssl-crl | File that contains certificate revocation lists | |||
--ssl-crlpath | Directory that contains certificate revocation-list files | |||
--ssl-fips-mode | Whether to enable FIPS mode on client side | |||
--ssl-key | File that contains X.509 key | |||
--ssl-mode | Desired security state of connection to server | |||
--ssl-session-data | File that contains SSL session data | 8.0.29 | ||
--ssl-session-data-continue-on-failed-reuse | Whether to establish connections if session reuse fails | 8.0.29 | ||
--tab | Produce tab-separated data files | |||
--tables | Override --databases or -B option | |||
--tls-ciphersuites | Permissible TLSv1.3 ciphersuites for encrypted connections | 8.0.16 | ||
--tls-version | Permissible TLS protocols for encrypted connections | |||
--triggers | Dump triggers for each dumped table | |||
--tz-utc | Add SET TIME_ZONE='+00:00' to dump file | |||
--user | MySQL user name to use when connecting to server | |||
--verbose | Verbose mode | |||
--version | Display version information and exit | |||
--where | Dump only rows selected by given WHERE condition | |||
--xml | Produce XML output | |||
--zstd-compression-level | Compression level for connections to server that use zstd compression | 8.0.18 |