☰
MySQL库操作全指南:建库、授权、备份与同步避坑详解
2026/10/5 11:03:00 网站建设 项目流程

做后端开发这几年,我见过太多团队把精力全砸在SQL优化、索引设计、事务隔离上,结果新项目一开工,建库这事就翻了车。字符集随手按默认的来、库名大小写没统一、root账号裸奔、删库靠手速……等到线上出现中文乱码、同步任务断流、DROP后磁盘不释放这些事故,才有人想起该给“MySQL关于库的操作”补补课。

在MySQL里,库(Database)看起来只是create database一行命令的事,但它背后连着物理目录、字符集、权限边界、备份恢复、甚至主从同步的整个链路。这篇内容不聊多高深的架构理论,就实打实从库的创建、修改、删除、授权、备份、同步这几个最常用的操作切入,把命令怎么用、参数怎么选、坑在哪里一次说透。无论是刚学MySQL的新手,还是被线上问题折磨过的老手,都能在这篇里找到能落地的东西。

1. 库操作全景:一条命令背后你到底操作了什么

1.1 库的物理形态:目录、文件与表空间

先说一个很多人没意识到的点:MySQL里的库,在磁盘上就是一个目录。

默认情况下,MySQL的数据目录(datadir,通常Linux下是/var/lib/mysql)里,每个数据库对应一个同名子目录。比如你建了一个app_order库,就会看到/var/lib/mysql/app_order目录。InnoDB引擎在独立表空间模式(innodb_file_per_table=ON)下,目录里面就是当前库里每张表的.ibd数据文件,比如/var/lib/mysql/app_order/t_order.ibd。

在MySQL 5.7及更早版本,每个库的目录下还会有一个db.opt文件,专门记录这个库的默认字符集和排序规则。到了MySQL 8.0,db.opt文件消失了,字符集这类元数据统一收编到数据字典里管理,物理目录里直接就是各表的文件。

这个物理认知有什么用?排查磁盘满的时候特别有感觉。我遇到过好几次磁盘告警,第一反应是查慢日志和binlog,结果发现全是/var/lib/mysql某个库目录太大。这时候直接du -sh /var/lib/mysql/*,谁占空间一眼就能看出来。备份和迁移时,如果你真想物理拷贝数据目录,也必须清楚版本之间目录结构差异巨大,跨版本直接拷贝data目录基本是自找麻烦。

1.2 库的逻辑定位:命名空间与权限边界

物理上库是目录,逻辑上库的核心价值是“命名空间”。

有了库,不同业务域里的同名表才能和平共处。一个项目里可以有app_order.t_user和app_pay.t_user,互不干扰。跨库访问也简单,写全限定名就行:SELECT * FROM app_order.t_user JOIN app_pay.t_user ...。

库还是权限的中间粒度。MySQL权限体系里,用户可以看到的数据库列表,由他的账号权限决定。SHOW DATABASES不是“把所有库列出来”,而是“列出当前用户有权限看到的库”。root能看到全部,业务账号经常只能看到一个或几个库。这也是很多人登录MySQL后奇怪“我的库怎么不见了”的原因——不是库没了,是你没权限。

理解这一点,后面做库级授权时就不会迷迷糊糊。

1.3 库操作的核心命令速览与易错点

库级操作命令数量不多,常用就五条,但每一条都有它的脾气。

命令作用容易踩的坑
SHOW DATABASES;列出有权限可见的库权限不足时看不到全部库,误以为库不存在
CREATE DATABASE ...;创建库不指定字符集就继承全局默认;重复创建会报错
ALTER DATABASE ...;修改库的默认属性只影响之后新建的表,不改已有表
USE ...;切换当前库Linux下库名大小写敏感,写错直接报错
DROP DATABASE ...;删除库及库下所有对象没有确认弹窗,没有回收站,删前不备份就是事故

五条命令看着简单,但每条展开都是坑。CREATE DATABASE如果不写字符集,就用服务器全局默认,偏偏很多老旧环境的默认字符集是历史遗留的utf8或者更早的latin1。DROP DATABASE更不用说了,生产环境手滑一次,体验比分手还痛。

所以库操作的核心不是“命令会不会”,而是“命令背后的选择对不对”。

2. 创建库前必须想清楚的三个决定:字符集、排序规则、存储引擎

2.1 从一次emoji乱码事故看字符集选择

先说一个真实事故。有个系统的用户昵称字段,突然有一批用户注册时怎么都存不进去,报错信息是Incorrect string value: '\xF0\x9F\x98\x80' for column 'nickname'。一看就明白了:这业务库建库时用的是utf8,而utf8在MySQL里实际是utf8mb3,最大只能存3字节的UTF-8字符。用户昵称里的emoji表情是4字节,直接塞不进去。

从MySQL 5.5.3开始,官方引入了utf8mb4,这才是完整的UTF-8实现。但有一件事要反复强调:MySQL 8.0之前,你写utf8,它默认指的就是utf8mb3,不是4字节的utf8mb4。所以建库时想支持emoji、生僻字,必须显式写utf8mb4。

选择utf8mb4不只是为了emoji。现在很多系统要对接手机端、微信生态,用户昵称、备注、消息内容什么字符都可能出现。用utf8mb4一劳永逸,存储成本多一点点,换来的却是“字符永远不丢”的安心。至于GBK这类老字符集,除非是历史系统兼容,新库一律别碰。

2.2 排序规则(Collation)决定的不只是排序

字符集后面还跟着一个排序规则(collation),这个参数经常被忽视,但它直接影响查询排序、比较结果,甚至唯一索引的判定。

最常用的几个:

  • utf8mb4_general_ci:不区分大小写的通用排序,速度快,是老版本MySQL的默认选择。
  • utf8mb4_unicode_ci:基于Unicode标准的排序,比较更准确,对多语言支持更好。
  • utf8mb4_0900_ai_ci:MySQL 8.0默认的排序规则,基于Unicode 9.0标准,ai表示不区分重音,ci表示不区分大小写。
  • utf8mb4_bin:二进制比较,区分大小写和重音,适合对字符串敏感的场景。

排序规则选错了会有什么后果?比如ci(case insensitive)不区分大小写,那么WHERE name='abc'会匹配到ABC;如果业务逻辑要求严格区分大小写,就要用bin。唯一索引也一样,在ci排序规则下,abc和ABC会被认为是重复值,直接违反你“允许同时存在”的业务预期。

还有一个跨版本兼容的大坑:utf8mb4_0900_ai_ci是MySQL 8.0才有的,5.7不支持。如果你在8.0里建库用了这个collation,然后把SQL文件丢到5.7环境执行,会直接报错Collation 'utf8mb4_0900_ai_ci' is not valid for character set 'utf8mb4'。所以如果团队里同时有5.7和8.0两套环境,库的collation最好统一用utf8mb4_general_ci,牺牲一点点精确性,换来环境迁移的平稳。

2.3 存储引擎:库没有引擎,但表默认引擎很重要

经常有人问,“建库的时候能不能指定存储引擎?”答案是不能。CREATE DATABASE语法里没有ENGINE参数,存储引擎是表级概念,默认引擎由系统变量default_storage_engine控制。

但库操作必须关心引擎,因为你会发现一个残酷的现实:如果不做任何配置,有的历史环境默认引擎是MyISAM,于是你在这个库里建的所有表都是MyISAM。MyISAM不支持行级锁,写操作直接锁全表;不支持事务,一堆操作做到一半出错回不去;崩溃后恢复也麻烦,要repair table。

InnoDB才是今天MySQL的主力引擎,支持事务、行锁、外键、MVCC和崩溃恢复。5.7开始InnoDB是默认引擎,8.0时代更是把很多MyISAM场景都收编了。我个人的习惯是:建库脚本里不依赖全局默认值,建表时显式写ENGINE=InnoDB,同时确认服务器变量default_storage_engine=InnoDB,双保险。

2.4 一条标准建库语句的完整拆解

把前面的决定落到SQL上,一条稳的建库语句长这样:

CREATE DATABASE IF NOT EXISTS app_order DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci;

IF NOT EXISTS是为了让脚本可重复执行,这个在自动化部署里特别重要。DEFAULT CHARACTER SET和DEFAULT COLLATE必须成对出现,而且排序规则必须属于对应字符集,否则MySQL直接报错。

建完库立刻用SHOW CREATE DATABASE确认:

SHOW CREATE DATABASE app_order\G

输出里能看到DEFAULT CHARACTER SET=utf8mb4和DEFAULT COLLATE=utf8mb4_0900_ai_ci,代表库默认属性已经定好。如果是要兼容5.7环境,就把collation换成utf8mb4_general_ci。

这里再提一句:MySQL 8.0开始CREATE DATABASE还支持COMMENT,可以直接在库上写用途说明,比如:

CREATE DATABASE app_order DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci COMMENT '订单中心核心库';

这个特性对团队协作很友好,至少不用猜这个库是干嘛的。

3. 库的修改、切换与删除:坑都在细节里

3.1 ALTER DATABASE 能改什么,不能改什么

ALTER DATABASE可以修改库的默认字符集和排序规则,仅此而已。它改不了库名、改不了数据存储路径,也改不了权限归属。

一个高频误解是:我改了库的字符集,为什么表里的乱码还在?

因为ALTER DATABASE改的只是“库的默认属性”,对已经存在的表没有任何影响。已有表的字符集在创建那一刻就固定了。如果你想把整个库的表字符集都改成utf8mb4,得对每个表执行ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4。

批量生成这些语句有一个实用小技巧,用information_schema动态拼:

SELECT CONCAT('ALTER TABLE `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'app_order' AND TABLE_TYPE = 'BASE TABLE';

把查询结果复制出来,确认无误后一条条执行。千万记得先备份再操作,字符集转换涉及全表重写,大表执行时会有锁和耗时,不是闹着玩的。

再说库改名。MySQL没有RENAME DATABASE这个命令。网上能看到用RENAME TABLE old.t1 TO new.t1逐个搬表的方案,但那只对表有效,视图、存储过程、函数、事件全都搬不动。最靠谱的库改名方案还是老办法:mysqldump导出,新建目标库,导入,核对数据,最后删旧库。土但稳。

3.2 USE 与大小写敏感:一套代码在Windows行,Linux就翻车

USE app_order切换当前库,这个没什么好说的。真正容易翻车的是库名大小写。

MySQL在Linux上默认lower_case_table_names=0,表名和库名严格区分大小写;Windows默认是1,不区分大小写,存储时全部转小写。这带来一个经典事故:开发在Windows机器上建了AppOrder库,代码里配置的也是AppOrder,本地一切正常。部署到Linux服务器时,运维导入SQL建库用了apporder,代码连上去就报Unknown database 'AppOrder'。

Windows上怎么都跑得通,Linux上就是找不到库,排查半天最后发现是大写字母的问题。

建议所有项目从第一天开始就统一库名规范:全小写、下划线分隔,不用驼峰,不用大小写混合。app_order这种命名在任何平台都不会踩大小写规则的坑。如果要设置lower_case_table_names=1强行让Linux也不区分大小写,务必在初始化时就设置好,因为改这个参数在实际生产库上风险非常高。

3.3 DROP DATABASE 的现实风险与安全心法

DROP DATABASE app_order这条命令执行后,库下的所有表、视图、存储过程、函数、事件、触发器全部消失,物理数据文件一并删除。MySQL没有回收站,没有弹窗确认,在客户端工具里点错了就是点错了。

我在生产环境是这么对待DROP DATABASE的:

第一,删库前必备份。哪怕觉得这个库已经没有用了,也先mysqldump一份存起来,按日期命名。等确认无误后,让备份文件再多留一两个月。

第二,删库前先查看库里的对象状况。执行一条快速检查:

SELECT table_schema, COUNT(*) AS cnt FROM information_schema.tables WHERE table_schema = 'app_order' GROUP BY table_schema;

如果结果和你预期的完全不一样,比如你以为是空库,结果里面还有两百多张表,那说明你要删的根本不是你以为的那个东西。

第三,绝对不要在生产环境用root账号连Navicat手动删库。这个教训来自真实事故:某同学把库删了,因为账号有DROP权限,删除瞬间完成,等张罗恢复数据时,先确认备份完整性、再导入Production,拉跨了半个业务。权限最小化,是这类事故最好的预防针。

3.4 一个真实问题:库删了,磁盘空间怎么没释放

有次我删了一个200GB的库,然后df -h一看,磁盘可用空间一点没变。当时的排查过程值得分享。

第一步看innodb_file_per_table。如果这个变量是OFF,说明表数据都放在共享表空间ibdata1里。这种情况下DROP DATABASE只是逻辑删除,物理文件ibdata1体积不会缩小,磁盘空间自然不释放。好在MySQL 8.0默认开启独立表空间,但很多从5.6、5.7时代演进过来的老实例,真有可能还是OFF。

第二步用lsof查文件句柄。有些进程还拿着已删除文件的句柄,文件虽然从目录里消失了,但磁盘空间要等句柄关闭才释放:

lsof +L1 | grep deleted

如果看到mysqld或者备份进程持有着/var/lib/mysql/app_order/t_order.ibd (deleted),就说明是这种情况。等那个进程结束,空间就回来了。

第三步看du -sh /var/lib/mysql/*,确认哪些库目录还占着空间。很多时候占用空间最大的不是业务库,而是一个忘了清理的历史库,这种就要按前面的安全心法处理。

4. 库级权限管理:别把root当日常账号用

4.1 授权怎么写才算规范

库级授权的核心是最小权限原则。给一个账号它能完成业务所需的权限,绝不多给。

MySQL 8.0和5.7在授权上有个重要差异:8.0里GRANT不能再隐式创建用户,必须先CREATE USER再授权。所以8.0下的标准姿势是:

-- 读写账号 CREATE USER 'app_rw'@'10.0.0.%' IDENTIFIED BY 'STRONG_PASSWORD'; GRANT SELECT, INSERT, UPDATE, DELETE ON app_order.* TO 'app_rw'@'10.0.0.%'; -- 只读账号,给BI报表用 CREATE USER 'bi_ro'@'10.0.1.%' IDENTIFIED BY 'RO_PASSWORD'; GRANT SELECT ON app_order.* TO 'bi_ro'@'10.0.1.%';

注意host段,不要无脑写%。'10.0.0.%'限定了应用服务器网段,就算密码泄露出去了,外部机器也连不上。生产库的核心库,我不建议用*.*这种全局授权,库粒度授权就够用了。

4.2 查看、审计与回收权限

想知道某个账号有哪些权限,一条命令:

SHOW GRANTS FOR 'app_rw'@'10.0.0.%';

想从库维度看都有哪些账号对哪些库有权限,查information_schema.SCHEMA_PRIVILEGES:

SELECT * FROM information_schema.SCHEMA_PRIVILEGES WHERE GRANTEE LIKE 'app%';

权限收回用REVOKE,比如收回DROP权限:

REVOKE DROP ON app_order.* FROM 'app_rw'@'10.0.0.%';

有个小知识点:用了GRANT/REVOKE之后,权限是即时生效的,不需要FLUSH PRIVILEGES。FLUSH PRIVILEGES只有在直接修改mysql.user表这类特殊操作后才可能需要执行。不要动不动就flush,真没必要。

4.3 开发、测试、生产三套库的权限切分实践

我经手过的项目,至少三套环境:开发库、测试库、生产库。账号必须分开,权限必须不同。

开发环境可以给开发同学DML+DDL权限,表结构随时改,没关系。测试环境给DML权限,加索引和改表结构走审批流程。生产环境只给DML,最好连DROP、ALTER都不给,需要做DDL变更时,由DBA临时授予后再收回。

很多团队最大的安全隐患就是:所有环境共用一个root密码,或者所有开发都拿着生产库的高权限账号。一旦误操作,没有审计,没有追溯,全凭当事人“刚才手滑了一下”的诚实。真出了问题,连责任边界都讲不清。

我的建议很朴素:核心库账号权限每次变更都留痕,库表DDL操作全部走工单,数据库管理层面的人永远比所有人都清楚谁能动什么,谁动过了什么。

5. 库的备份、恢复与搬运:把整个库安全带走

5.1 mysqldump 精确备份单个库的命令细节

备份单个库最常用的是mysqldump,但命令参数千万别记错。

mysqldump -u备份账号 -p \ --single-transaction \ --set-gtid-purged=OFF \ --default-character-set=utf8mb4 \ --routines --events --triggers \ --databases app_order > app_order_20250614.sql

逐个说参数:

  • --single-transaction:对InnoDB来说,这条能拿到一个一致性的快照,备份过程中不锁表,业务照常写。但它只对InnoDB有效,如果库里混着MyISAM表,还是会锁。
  • --set-gtid-purged=OFF:如果目标实例没有开启GTID,备份文件里不要写入SET @@GLOBAL.GTID_PURGED,否则恢复时版本或环境不匹配容易报错。
  • --default-character-set=utf8mb4:防止导出时按系统默认字符集转码,中文变成一堆乱码。
  • --routines --events --triggers:这三个参数不带,存储过程、事件、触发器都不会备份出来。很多人备份库,数据备份了,存储过程丢了,恢复后业务直接报错找不到对象。
  • --databases:有了它,备份文件里自动包含CREATE DATABASE和USE语句,恢复时不用手动建库。只想导出表数据然后恢复到已有库里,就不要加这个参数。

备份完成后别急着走,花十秒钟看一眼文件开头:

head -50 app_order_20250614.sql

确认里面有utf8mb4字符集声明、有正确的数据库名,再收工。

5.2 恢复库的两种方式与常见报错

恢复方式有两种,效果一样:

mysql -u root -p < app_order_20250614.sql

或者进入MySQL后执行:

SOURCE /tmp/app_order_20250614.sql;

恢复过程中我遇到最多的报错有三种。

第一种,ERROR 1049 Unknown database。备份时没加--databases,而且目标库还不存在。解决方法是先手动建库再source,建库时把字符集和排序规则按源库写好。

第二种,ERROR 1366 Incorrect string value。多半是连接字符集和目标库字符集不是utf8mb4,中间环节转码失败。重新执行时加上--default-character-set=utf8mb4,并确认库表字段都是utf8mb4。

第三种,存储过程恢复时ERROR 1418。备份时漏了--routines,或者定义者(definer)用户不存在。前者重新备份,后者确认目标库里存在对应的definer用户。

恢复完后别只看“执行成功”就完了,要抽样验证行数:

SELECT COUNT(*) FROM app_order.t_order;

5.3 Docker 环境下 MySQL 的库操作与备份

现在很多人直接用Docker跑MySQL,库操作本身没有区别,但容器这个壳带来了新的注意点。

启动容器时一定要挂载数据卷,否则容器一删,数据全没:

docker run -d --name mysql8 \ -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=你的密码 \ mysql:8.0

进容器操作:

docker exec -it mysql8 mysql -uroot -p

备份到宿主机:

docker exec mysql8 mysqldump \ --single-transaction --databases app_order > /data/mysql/backup.sql

恢复:

docker exec -i mysql8 mysql -uroot -p < /data/mysql/backup.sql

这里有一个容易忽略的细节:docker exec不带-i时,标准输入是关闭的,恢复命令会报错ERROR 1049或者直接卡住。带上-i才能把宿主机文件内容喂进容器里的mysql进程。

至于“Docker拉取MySQL镜像失败”“failed to decode referrers index”这类报错,多半是镜像仓库配置和网络问题。通用排查思路是检查本机/etc/docker/daemon.json里镜像源配置是否正确、DNS能否解析镜像仓库域名、磁盘空间是否够用。实在不行,换一个确认没问题的镜像源地址,再docker pull mysql:8.0试试。

5.4 初始化 MySQL 后建库前的必要检查

很多安装问题其实都是库操作的前置问题。Windows上常见的net start mysql服务无法启动,绝大多数可以归因到四类:

  • my.ini放在MySQL安装目录下,但路径写错了;
  • 服务指定的data目录没有初始化,或者初始化目录权限不对;
  • 端口3306被其他进程占用,检查netstat -ano | findstr 3306;
  • 初始化方式用错了,MySQL 8.0用mysqld --initialize-insecure,再用mysql_install_db这种老命令反而不对。

看到错误时,先看MySQL的错误日志,最常见的是mysql.err文件或者Windows事件管理器里的报错记录,日志永远比乱猜靠谱。服务起不来,什么库操作都免谈。

6. 库在同步迁移场景中的特殊要求

6.1 让一个库成为数据同步源,先改好binlog

热词里有“使用Flink实现MySQL同步到ClickHouse”,这类场景本质上都是解析MySQL的binlog。想让一个库被Canal、Debezium、Flink CDC这些工具同步,库本身只需要正常业务就好了,真正要改的是MySQL实例层面的参数:

server-id=100 log_bin=mysql-bin binlog_format=ROW binlog_row_image=FULL

其中binlog_format=ROW是关键,只有行级binlog才能精确记录每一行数据的变化。GTID建议开启,主从或者断点续传的时候省很多事。

与库操作相关的是:同步工具通常要指定监听哪些库和表,比如Canal里配置canal.instance.filter.regex = app_order\\..*。你新建了一个库却忘了在同步工具里放行,同步任务里自然就看不到它。这类问题排查时容易忽略,以为是工具坏了,其实是工具配置里根本没有这个库的名字。

6.2 MySQL 5.7 与 8.0 在库层面的兼容差异

5.7和8.0在库操作上最明显的差异有三处。

第一,默认字符集和排序规则不同。8.0默认utf8mb4_0900_ai_ci,5.7默认utf8mb4_general_ci。跨版本导出导入时,建库语句如果带着0900的collation到5.7,会直接报错。

第二,认证插件不同。8.0默认密码认证插件是caching_sha2_password,5.7及以前多为mysql_native_password。老版本的客户端、低版本的ODBC驱动连8.0时,会报认证插件不兼容的错误。应用侧要么升级驱动,要么在MySQL侧临时把用户的认证方式改回mysql_native_password,但后者只是过渡方案。

第三,元数据存储方式不同。5.7里每个库目录下有db.opt,8.0没有了。前几年出现过有人跨版本直接拷贝data目录导致库无法识别的案例,这属于物理备份踩坑,逻辑备份(mysqldump)是跨版本迁移的稳妥路径。

6.3 目标端建库注意字符集对齐

同步的目的地不管是ClickHouse还是PostgreSQL,建目标库时都要考虑字符集对齐。MySQL源库用的是utf8mb4,目标库如果用了一个默认排序规则完全不同的字符集,中文字符有可能在同步链路里被截断或转成乱码。

实操建议是:数据同步链路里的每个存储节点,字符集横向统一。源库建库时用utf8mb4,目标端无论MySQL、ClickHouse还是其他分析型数据库,都按UTF-8系列设置。同步任务真正跑起来之前,先做小批量数据验证,重点看中文、表情、特殊符号是否原样落地,确认无误再放开全量同步。

7. 库操作高频问题排查速查表

把线上最常遇到的和库操作直接相关的坑整理成一张表,按行对症处理。

问题现象可能原因快速处理
SHOW DATABASES看不到某库当前账号没有该库权限用root或管理员账号执行GRANT SELECT ON db.* TO ...
CREATE DATABASE报权限不足账号没有CREATE权限授予CREATE权限,或申请DBA操作
建库报Collation 'utf8mb4_0900_ai_ci' is not valid当前MySQL版本不支持该排序规则用与版本匹配的collation,5.7换utf8mb4_general_ci
中文和emoji存成问号或报错库/表/字段/连接字符集不一致库里字符集统一utf8mb4;连接串加characterEncoding=utf8mb4;执行SET NAMES utf8mb4
8.0客户端连不上报认证插件问题认证插件是caching_sha2_password升级驱动;过渡期可把用户改成mysql_native_password
net start mysql服务无法启动my.ini路径不对、data未初始化、端口占用、权限问题查看错误日志,检查my.ini、data目录、端口监听
DROP了库但磁盘空间不释放独立表空间未开,或文件句柄未释放确认innodb_file_per_table=ON;用lsof +L1查deleted文件
找库时大小写报错Linux下区分大小写,库名大小写不匹配代码和库名统一小写;必要时谨慎设置lower_case_table_names
关联查询报Illegal mix of collations两边表或字段的collation不一致统一collation;SQL里用CONVERT临时转

最后再分享一个实用小习惯。我会在项目根目录放一份schema_init.sql,内容固定:root账号加固、创建业务账号、按环境授权、建库时固定utf8mb4和对应collation、确认innodb_file_per_table=ON。新环境从零到三套库上线,基本十分钟搞定。这套脚本一开始就是我为了不重蹈乱码和误删的覆辙写的,后来发现团队里的人都在抄这份模板。建库这个动作本身不难,难的是把每个细节都固定成规范,让所有人都按规范来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询