能把MySQL数据库从Windows拷贝到Linux吗?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 把MySQL数据库从Windows迁移到Linux,最简单的方法当然是采用文件拷贝的方式进行迁移。这里当然是有坑的,首先想到是不同操作系统之间的字节序的问题,Oracle的RMAN可以实现相同字节序跨平台迁移数据库,还可以对不同的字节序进行转换,下面先在Oracle的视图

把MySQL数据库从Windows迁移到Linux,最简单的方法当然是采用文件拷贝的方式进行迁移。这里当然是有坑的,首先想到是不同操作系统之间的字节序的问题,Oracle的RMAN可以实现相同字节序跨平台迁移数据库,还可以对不同的字节序进行转换,下面先在Oracle的视图V$TRANSPORTABLE_PLATFORM上查询一下Windows平台和Linux的字节序是否相同:


SQL> COLUMN PLATFORM_NAME FORMAT A32
set linesize 200
SELECT PLATFORM_NAME,ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM where platform_name like '%Windows%' or platform_name like '%Linux%';SQL> SQL> 
PLATFORM_NAME    ENDIAN_FORMAT
-------------------------------- --------------
Microsoft Windows IA (32-bit)  Little
Linux IA (32-bit)   Little
Linux IA (64-bit)   Little
Microsoft Windows IA (64-bit)  Little
IBM zSeries Based Linux   Big
Linux x86 64-bit   Little
Microsoft Windows x86 64-bit  Little
IBM Power Based Linux   Big
Linux OS (S64)    Big
9 rows selected.



查询发现Windows平台和Linux平台都是小字节序,因此应该可以使用拷贝的方式从Windows迁移到Linux的。


另外一个需要考虑的是系统参数lower_case_table_names的设置问题。不同平台的lower_case_table_names的设置会影响数据的迁移。这个参数有3个值:


如果设置为0,表名将按指定方式存储,并且比较区分大小写。

如果设置为1,表名在磁盘上以小写形式存储,比较不区分大小写。

如果设置为2,表名按给定的格式存储,但以小写形式进行比较。

此选项也适用于数据库名称和表别名。这个参数在在不同的平台上有不同的默认值:


在Windows上,默认值为1,不支持0。

在macOS上,默认值为2。

在Linux上,默认值为0,不支持值2。

在MySQL 8之前可以通可以通过配置文件修改这个参数,修改后重启数据库生效。8.0 之后的版本,只允许在数据库初始化时指定,之后就不允许修改了。


目标数据库的MySQL版本号大于或等于源数据库的版本号,不同版本号之间迁移不支持crash recovery。


从Linux平台迁移到Windows平台

Linux平台系统参数lower_case_table_names默认是0,建库的时候是使用大小写敏感的方式创建的数据库,移到Windows平台会因为Windows不区分大小写而失败。如果要把MySQL数据从Linux平台迁移到Windows平台,需要在创建数据库的时候就指定系统参数lower_case_table_names为1。下面是以默认方式进行数据库迁移失败的过程。


把数据库文件从Linux平台拷贝到Windows平台:


C:\Program Files\PuTTY>pscp -r root@192.168.???.???:/var/lib/mysql/* c:\linux_data
The server's host key is not cached. You have no guarantee
that the server is the computer you think it is.
The server's ecdsa-sha2-nistp256 key fingerprint is:
ecdsa-sha2-nistp256 256 SHA256:rpW9pEeCVuwsvUW2ZamjbSfT25354IOu51Bm05S+MvE
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n, Return cancels connection, i for more info) y
root@192.168.???.???'s password:
ibdata1                   | 12288 kB | 12288.0 kB/s | ETA: 00:00:00 | 100%
ib_logfile1               | 49152 kB | 24576.0 kB/s | ETA: 00:00:00 | 100%
undo_001                  | 12288 kB | 6144.0 kB/s | ETA: 00:00:00 | 100%
undo_002                  | 12288 kB | 12288.0 kB/s | ETA: 00:00:00 | 100%
ib_logfile0               | 49152 kB | 16384.0 kB/s | ETA: 00:00:00 | 100%
mysql.ibd                 | 25600 kB | 25600.0 kB/s | ETA: 00:00:00 | 100%
...



文件传输完成后,启动mysqld:


C:\Program Files\MySQL\MySQL Server 8.0\bin>mysqld --no-defaults --console --datadir=c:\linux_data
2021-09-09T02:56:23.406039Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.26) starting as process 15396
2021-09-09T02:56:23.661170Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-09-09T02:56:25.535866Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-09-09T02:56:25.611530Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
2021-09-09T02:56:25.613984Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2021-09-09T02:56:25.619065Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-09-09T02:56:26.095979Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.


提示因为服务的参数lower_case_table_names settings和数据字典里面这个参数不同,无法启动,因为数据是从Linux平台来的,数据字典里面这个参数是0,这是创建数据库的时候决定的,无法进行修改。但可以把服务启动时候的参数改成0,再试一下:


C:\Program Files\MySQL\MySQL Server 8.0\bin>mysqld --no-defaults --console --datadir=c:\linux_data --lower_case_table_names=0
2021-09-09T02:56:47.120358Z 0 [System] [MY-010116] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe (mysqld 8.0.26) starting as process 14188
2021-09-09T02:56:47.127009Z 0 [ERROR] [MY-010158] [Server] The server option 'lower_case_table_names' is configured to use case sensitive table names but the data directory is on a case-insensitive file system which is an unsupported combination. Please consider either using a case sensitive file system for your data directory or switching to a case-insensitive table name mode.
2021-09-09T02:56:47.136881Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-09-09T02:56:47.138070Z 0 [System] [MY-010910] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.


改成对大小写敏感也启动不了,这是自然,windows不支持文件名区分大小写。


从Windows平台迁移到linux平台

进行数据文件的传输:


"c:\Program Files\PuTTY\pscp.exe" -r "C:\ProgramData\MySQL\MySQL Server 8.0\Data\*" root@192.168.18.227:/var/lib/mysql2


把属主从root修改成mysql:


[root@localhost mysql2]# chown -R mysql. ../mysql2


在Linux上启动:


# mysqld --no-defaults --datadir=/var/lib/mysql2 --user=mysql --log-error-verbosity=3
...
2021-09-08T11:03:04.942353Z 1 [ERROR] [MY-012530] [InnoDB] Unknown redo log format (4). Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/ upgrading-downgrading.html.
2021-09-08T11:03:04.942460Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.


因为windows平台的版本高,从高版本到低版本不行。改成同一个版本后启动:


# mysqld --no-defaults --datadir=/var/lib/mysql2 --user=mysql --log-error-verbosity=3
...
2021-09-08T11:29:12.492105Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').
2021-09-08T11:29:12.492688Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2021-09-08T11:29:12.493236Z 0 [ERROR] [MY-010119] [Server] Aborting


启动失败,又是因为服务的参数lower_case_table_names settings和数据字典里面这个参数不同造成的,把服务的这个参数设置成1后再次启动:


# mysqld --no-defaults --datadir=/var/lib/mysql2 --user=mysql --log-error-verbosity=3 --lower_case_table_names=1
...
mysqld: File '.\binlog.000001' not found (OS errno 2 - No such file or directory)
2021-09-08T11:30:21.679737Z 0 [ERROR] [MY-010958] [Server] Could not open log file.
2021-09-08T11:30:21.680220Z 0 [ERROR] [MY-010041] [Server] Can't init tc log
2021-09-08T11:30:21.680753Z 0 [ERROR] [MY-010119] [Server] Aborting
...


又是启动失败,提示文件.\binlog.000001找不,修改改一下binlog.index中的文件名,把反斜线改成正斜线后再试试:


[root@localhost mysql2]# cat binlog.index 
.\binlog.000001


再次启动,运行成功!

[root@localhost mysql2]# mysqld --no-defaults --datadir=/var/lib/mysql2 --user=mysql --log-error-verbosity=3 --lower_case_table_names=1
...
2021-09-08T11:37:11.208204Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock


连接进入后检查服务的uuid和数据目录如下:


mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid                        |
+--------------------------------------+
| 0ba5f5da-0fbb-11ec-bfce-fa163ed6756a |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> select @@datadir;
+------------------+
| @@datadir        |
+------------------+
| /var/lib/mysql2/ |
+------------------+
1 row in set (0.00 sec)


发现是和windows上的MySQL同一个uuid,数据目录是从windows上传输过来的数据目录。


总结

从windows到linux可以直接拷贝方式传输数据库,兼容性如下:


源平台 目标平台 MySQL版本 是否可以拷贝数据文件

Windows Linux >8.0 可以

Linux Windows >8.0 不行

Windows Linux <8.0 可以

Linux Windows <8.0 可以

说明:


这里列举的是默认设置,如果在创建数据库的时候在Linux平台上设置–lower_case_table_names=1,在MySQL 8上也可以把Linux平台上的数据拷贝到Windows平台。


应该在数据库关闭或者设置了全局读锁(flush tables with read lock)后进行文件拷贝。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
32 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
10天前
|
自然语言处理 安全 Java
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
32 6
|
13天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
26天前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
52 4
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
20天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
8天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
72 15
|
2天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
9天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
13天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。