mysql5.7 备份指定字符开头的表,密码包含特殊字符

本文介绍了解决MySQL备份中遇到的特殊字符问题、指定字符开头的表备份及压缩方法,并提供了一个Java代码示例用于执行这些操作。

总结

1,解决mysql密码包含特殊字符的问题:
正常命令形如: mysqldump -u root -p 你的密码
包含特殊字符形如: mysqldump -u root --password='你的密码'
2,解决指定字符开头的问题和压缩问题:
压缩:mysqldump -u root --password='你的密码' 数据库名 $(mysql -u root --password='你的密码' 数据库名 -Bse "show tables like '指定开头的字符%'") | gzip > backup-$(date "+%Y-%m-%d").sql.gz
不压缩:mysqldump -u root --password='你的密码' 数据库名 $(mysql -u root --password='你的密码' 数据库名 -Bse "show tables like '指定开头的字符%'") > backup-$(date "+%Y-%m-%d").sql
3,java代码

public void backupDB() throws Exception {
        String[] cmd = new String[] {"/bin/sh", "-c", ""};
        try {
            StringBuilder arg = new StringBuilder();
            arg.append("mysqldump ");
            arg.append("-u root ");
            arg.append("--password='可带有特殊字符的密码' ");
            arg.append("--default-character-set=utf8 ");   // 指定字符集
            arg.append("--skip-opt ");  // 禁用将结果存入内存,否则大表会出现问题
            arg.append("--add-drop-database "); // 在CREATE DATABASE之前加 drop语句
            arg.append("--compress ");  // 压缩传输的信息
            arg.append("--databases 数据库名 ");  // 指定数据库
            arg.append("--tables $(mysql -u root --password='可带有特殊字符的密码' 数据库名 -Bse \"show tables like '指定开头的字符%'\") ");  // 指定表
            arg.append("--result-file /root/dbbackup/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() + ".sql"); // 文件路径+ 文件名
            cmd[2] = arg.toString();

            Process process = Runtime.getRuntime().exec(cmd);
            boolean exitValue = process.waitFor(20, TimeUnit.SECONDS); // 最多等待20s
            if (!exitValue) {
                throw new Exception("执行命令[" + JSON.toJSONString(cmd) + "]超时");
            }
        } catch (Throwable e) {
            log.error("执行命令[" + JSON.toJSONString(cmd) + "]失败. " + e);
            throw new Exception(e);
        }
    }

4,多个表的时候,如何处理

举例:show tables from stock_db where tables_in_stock_db like ‘biz_%’ or tables_in_stock_db like ‘st_%’

SHOW TABLES
FROM `<yourdbname>`
WHERE 
    `Tables_in_<yourdbname>` LIKE '%cms%'
    OR `Tables_in_<yourdbname>` LIKE '%role%';

一些参考:
1,mysqldump命令详解:https://www.jianshu.com/p/aaffa08e7853
2,Java程序在运行cmd命令mysqldump的时候失效的原因:https://blog.youkuaiyun.com/weixin_40920882/article/details/106362953
3,https://stackoverflow.com/questions/5609620/show-tables-statement-with-multiple-like-values

<think> 首先,用户的问题是:“我想了解mysql 5.7在未显示指定字符集和字符序时服务端的处理方式”。意思是,当没有明确指定字符集(character set)和字符序(collation)时,MySQL 5.7 服务器如何处理这些设置。 我需要参考提供的引用内容。引用[1]提到“MySQL 5.7 字符集设置指南”,强调乱码问题源于字符集设置不当。引用[2]建议使用“utf8mb4”。引用[3]和[4]展示了配置文件(my.cnf 或 my.ini)中的设置,如 `character-set-server=utf8`。 关键点是“未显示指定字符集和字符序时”,意思是用户没有在配置文件中设置这些值。 系统级指令要求: - 所有行内数学达式使用 $...$ 格式,但这里可能不涉及数学达式。 - 独立公式用 $$...$$,但同样可能不适用。 - LaTeX语法正确:确保任何数学格式正确。 - 使用中文回答。 - 生成相关问题:在回答后添加相关问题。 - 回答中引用的段落末尾添加引用标识,如 [^1]。 回答结构: - 清晰、逐步解释。 - 保证真实可靠,基于MySQL文档或可靠来源。 核心知识: MySQL 5.7 在未指定字符集时的默认行为: - 默认字符集:在MySQL 5.7中,如果没有指定字符集默认为 `latin1`。字符序默认为 `latin1_swedish_ci`。 - 服务端级别:在配置文件中,如果没有设置 `character-set-server`,它将使用 `latin1`。 - 数据库级别:如果创建数据库时没有指定,它将继承服务端的设置。 - 级别:如果没有指定,继承数据库的设置。 - 列级别:如果没有指定,继承的设置。 从引用中提取: - 引用[3]:在 my.cnf 中,如果没有设置 `character-set-server`,默认是 `latin1`(如它提到“服务端使用的字符集默认为8比特编码的latin1字符集”)。 - 引用[2]:推荐使用“utf8mb4”,但这是建议,不是默认。 - 引用[1]:强调乱码问题,暗示默认设置可能导致问题。 步骤回答: 1. **解释默认字符集和字符序**:MySQL 5.7 服务端如果没有在配置文件中指定,默认字符集是 `latin1`,字符序是 `latin1_swedish_ci`。 2. **为什么是latin1**:历史原因,latin1 是早期MySQL的默认。 3. **潜在问题**:latin1 不支持中文等非拉丁字符,可能导致乱码。 4. **如何避免**:建议在配置文件中明确设置如 `character-set-server=utf8mb4` 和 `collation-server=utf8mb4_unicode_ci`。 5. **验证方式**:用户可以通过运行查询如 `SHOW VARIABLES LIKE 'character_set_server';` 或 `SHOW VARIABLES LIKE 'collation_server';` 来检查当前设置。 添加引用: - 在回答中引用相关段落。例如,提到默认设置时引用引用[3]。 - 引用[3]说:“服务端使用的字符集默认为8比特编码的latin1字符集”,所以可以引用这个。 生成相关问题: - 在回答后添加3个相关问题,如: 1. 如何检查MySQL服务端的当前字符集和字符序设置? 2. 修改MySQL配置文件的字符集设置后需要重启服务吗? 3. 为什么推荐使用utf8mb4而不是utf8? 确保回答真实可靠:基于MySQL官方文档。我知道MySQL 5.7默认是latin1,但确认一下:是的,MySQL 5.7的默认字符集是latin1。 完整回答结构: - 先简要解释未指定时的处理方式。 - 然后逐步详细说明。 - 结束时添加相关问题。 </think> 在MySQL 5.7中,当服务端未显式指定字符集(character set)和字符序(collation)时,系统会使用内置的默认值来处理这些设置。这种默认行为可能导致数据存储和显示不一致(如乱码问题),尤其是涉及非拉丁字符(如中文)时。下面我逐步解释服务端的处理逻辑,确保回答真实可靠,并基于MySQL官方文档和实践经验。 ### 1. **服务端级别的默认设置** - MySQL 5.7服务端在启动时,如果没有在配置文件(如 `my.cnf` 或 `my.ini`)中指定字符集和字符序,会使用以下内置默认值: - **默认字符集**:`latin1`(ISO-8859-1)。这是一个8位字符集,仅支持西欧语言(如英语、德语),不支持中文、日文等多字节字符[^3]。 - **默认字符序**:`latin1_swedish_ci`。这是一个不区分大小写的排序规则,基于瑞典语规则设计。 - **为什么是latin1?** 这是MySQL的历史遗留设计,早期版本为兼容性而保留此默认。但 `latin1` 无法正确处理中文等Unicode字符,易导致乱码[^1]。 - **验证方式**:你可以通过SQL查询检查服务端当前设置: ```sql SHOW VARIABLES LIKE 'character_set_server'; -- 返回如 'latin1' SHOW VARIABLES LIKE 'collation_server'; -- 返回如 'latin1_swedish_ci' ``` ### 2. **配置继承机制** MySQL字符设置采用层级继承机制。未显式指定时,下级对象继承上级的默认值: - **数据库级别**:如果创建数据库时未指定字符集(如 `CREATE DATABASE mydb;`),该数据库会继承服务端的 `character_set_server` 和 `collation_server` 值。 - **级别**:如果创建时未指定(如 `CREATE TABLE mytable (...);`),会继承数据库字符设置。 - **列级别**:如果列定义中未指定(如 `name VARCHAR(255);`),列会继承字符设置。 - **潜在风险**:如果服务端默认为 `latin1`,所有下级对象都可能使用此设置。存储中文时,数据会被截断或转换为问号(�),导致乱码[^1][^2]。 ### 3. **默认设置的来源** - **配置文件优先级**:MySQL服务端优先从配置文件加载设置。如果文件中未包含 `[mysqld]` 节下的 `character-set-server` 或 `collation-server` 参数(如引用[3]和[4]所示),系统回退到内置默认值 `latin1`[^3]。 - **编译时默认**:在MySQL 5.7的源代码编译中,`latin1` 是硬编码的默认值。除非修改配置,否则服务端始终使用此设置。 - **示例配置**:如引用[3]所述,在 `my.cnf` 中添加 `character-set-server=utf8` 可覆盖默认值。但若未设置,服务端维持 `latin1`[^3]。 ### 4. **推荐实践以避免问题** - **显式设置字符集**:在配置文件中添加以下行(推荐 `utf8mb4` 而非 `latin1` 或 `utf8`,因为 `utf8mb4` 支持完整的Unicode,包括emoji和四字节字符)[^2]: ```ini [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci ``` - **检查与修改**: - 安装后立即检查服务端变量(如 `SHOW VARIABLES LIKE '%char%';`)。 - 如果已使用默认设置创建对象,需通过 `ALTER DATABASE` 或 `ALTER TABLE` 命令修改。 - **影响范围**:修改配置文件后需重启MySQL服务生效。未重启时,新连接可能仍使用旧设置。 ### 总结 在MySQL 5.7中,未显式指定字符集和字符序时,服务端默认使用 `latin1` 和 `latin1_swedish_ci`。这种设置对中文不友好,易引发乱码。最佳实践是在配置文件(如 `my.cnf`)中明确指定 `utf8mb4` 字符集和兼容的字符序(如 `utf8mb4_unicode_ci`),以确保数据一致性[^1][^2][^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值