做好mysql运维,必须熟练掌握备份和恢复,实战一次不行多来几次

一、 备份恢复策略

进行备份或恢复操作时需要考虑一些因素:

1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备份方式在处理数据一致性方面是不太一样的。

2、确定使用全备份还是增量备份。全备份的优点是备份保持最新备份,恢复的时候可以花费更少的时间;缺点是如果数据量大,将会花费很多的时间,并对系统造成较长时间的压力。增量备份相反,只需要备份每天的增量日志,备份时间少,对负载压力也小;缺点就是恢复的时候需要全备份加上次备份到故障前的所有日志,恢复时间长一些。

3、可以考虑采用复制的方法来做异地备份,但不能代替备份,它对数据库的误操作也无能为力。

4、要定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行

5、确保 MySQL 打开 log-bin 选项,有了 binlog,MySQL 才可以在必要的时候做完整恢复,或基于时间点的恢复,或基于位置的恢复。

6、经常做备份恢复测试,确保备份是有效的,是可以恢复的。

二、 逻辑备份和恢复

在 MySQL 中,逻辑备份的最大优点是对于各种存储引擎都可以用同样的方法来备份;而物理备份则不同,不同的存储引擎有着不同的备份方法,因此,对于不同存储引擎混合的数据库,逻辑备份会简单一点。

1. 备份

MySQL 中的逻辑备份是将数据库中的数据备份为一个文本文件,备份的文件可以被查看和编辑。在 MySQL 中,可以使用 mysqldump 工具来完成逻辑备份:

// 备份指定的数据库或者数据库中的某些表

shell> mysqldump [options] db_name [tables]

// 备份指定的一个或多个数据库

shell> mysqldump [options] --database DB1 [DB2,DB3...]

// 备份所有数据库

shell> mysqldump [options] --all-database如果没有指定数据库中的任何表,默认导出所有数据库中的所有表。

示例:

1. 备份所有数据库:

shell>mysqldump -uroot -p --all-database > all.sql2. 备份数据库 test

shell>mysqldump -uroot -p test > test.sql3. 备份数据库 test 下的表 emp

shell> mysqldump -uroot -p test emp > emp.sql4. 备份数据库 test 下的表 emp 和 dept

shell> mysqldump -uroot -p test emp dept > emp_dept.sql5. 备份数据库test 下的所有表为逗号分割的文本,备份到 /tmp:

shell> mysqlddump -uroot -p -T /tmp test emp --fields-terminated-by ','shell> more emp.txt 1,z12,z23,z34,z4注意:为了保证数据备份的一致性, myisam存储引擎在备份时需要加上-l参数,表示将所有表加上读锁,在备份期间,所有表将只能读而不能进行数据更新。但是对于事务存储引擎来说,可以采用更好的选项 --single-transaction,此选项使得 innodb 存储引擎得到一个快照(snapshot),使得备份的数据能够保证一致性。

2. 完全恢复

mysqldump 的恢复也很简单,将备份作为输入执行即可:

mysql -uroot -p db_name < backfile注意,将备份恢复后数据并不完整,还需要将备份后执行的日志进行重做:

mysqlbinlog binlog-file | mysql -uroot -p

完整的 mysqldump 备份与恢复示例:

1. 凌晨 2:00,备份数据库:

root@bogon:/usr/local/mysql/bin$ ./mysqldump -uroot -p -l -F t2 > t2.dmp

Enter password:

其中 -l参数表示给所有表加读锁,-F表示生成一个新的日志文件,此时,t2 中 emp 表的数据如下:

# 为了便于测试,执行 reset master 删除所有 binlog。

MySQL [(none)]> reset master;

Query OK, 0 rows affected (0.00 sec)

# 此时只有一个 binlog 日志文件 mysql-bin.000001

MySQL [t2]> select * from test;

+------+------+

| id | name |

+------+------+

| 1 | a |

| 2 | b |

+------+------+

2 rows in set (0.00 sec)2. 备份完毕后,插入新的数据:

# 因为上一步执行是加入了 -F 选项, 所以接下来的操作会被记录到新的二进制文件,即名为 mysql-bin.000002 的文件

MySQL [t2]> insert into test values (3,'c');

Query OK, 1 row affected (0.00 sec)

MySQL [t2]> insert into test values (4,'d');

Query OK, 1 row affected (0.00 sec)3. 数据库突然故障(其实是小伙伴没事儿删库练手玩儿),数据无法访问。需要恢复备份:

删库跑路:

# 这里为了便于测试,不把删库操作记入日志,当前 session 设置 sql_log_bin 为 off。

# 删库后,执行 flush logs,让后续的 binlog 到新的文件中,即名为 mysql-bin.000003中

MySQL [t2]> set sql_log_bin = 0;

Query OK, 0 rows affected (0.00 sec)

MySQL [t2]> show variables like "%sql_log_bin%";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sql_log_bin | OFF |

+---------------+-------+

1 row in set (0.00 sec)

MySQL [t2]> drop database t2;

Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> flush logs;

Query OK, 0 rows affected (0.22 sec)

MySQL [t2]> drop database t2;

Query OK, 3 rows affected (0.23 sec)

MySQL [(none)]> exit;

Bye数据恢复:

root@bogon:/usr/local/mysql/bin# ./mysql -e "create database t2"

root@bogon:/usr/local/mysql/bin# ./mysql t2 < t2.dmp

*******************************************************************

MySQL [t2]> select * from test;

+------+------+

| id | name |

+------+------+

| 1 | a |

| 2 | b |

+------+------+

2 rows in set (0.00 sec)4. 使用 mysqlbinlog 恢复自 mysqldump 备份以来的 binglog

根据前面操作的内容,可知从备份的时间点到删库的时间点之间的操作被记录到了 mysql-bin.000002 文件中

root@bogon:/usr/local/mysql/bin# ./mysqlbinlog --no-defaults /data/mysql/mysql-bin.000002 | ./mysql t2

*******************************************************

MySQL [t2]> select * from test;

+------+------+

| id | name |

+------+------+

| 1 | a |

| 2 | b |

| 3 | c |

| 4 | d |

+------+------+

4 rows in set (0.00 sec)至此,数据恢复成功。

3. 基于时间点恢复

由于误操作,比如误删除了一张表,这时使用完全恢复时没有用的,因为日志里面还存在误操作的语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作语句,再恢复后面执行的语句,完成恢复。这种恢复叫不完全恢复,在 MySQL 中,不完全恢复分为 基于时间点的恢复和基于位置的恢复。基于时间点恢复的操作步骤:

(1) 如果是上午 10 点发生了误操作,可以用以下语句用备份和 binlog 将数据恢复到故障前:

shell>mysqlbinlog --stop-date="2017-09-30 9:59:59" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword(2) 跳过故障时的时间点,继续执行后面的 binlog,完成恢复。

shell>mysqlbinlog --start-date="2017-09-30 10:01:00" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword

4. 基于位置恢复

和基于时间点的恢复类似,但是更精确,因为同一个时间点可能有很多条 sql 语句同时执行。恢复的操作步骤如下:

(1) 在 shell 下执行命令:

shell>mysqlbinlog --start-date="2019-09-30 9:59:59" --stop-date="2019-09-30 10:01:00"/data/mysql/mysql-bin.123456 > /tmp/mysql_restore.sql该命令将在 /tmp 目录创建小的文本文件,编辑此文件,知道出错语句前后的位置号,例如前后位置号分别为 368312 和 368315。

(2) 恢复了以前的备份文件后,应从命令行输入下面的内容:

shell>mysqlbinlog --stop-position="368312" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword

shell>mysqlbinlog --start-position="368315" /data/mysql/mysql-bin.123456 | mysql -uroot -ppassword上面的第一行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为 mysqlbinlog 的输出包括每个 sql 语句记录之前的 set timestamp 语句,因此恢复的数据和相关的 mysql 日志将反映事务执行的 原时间。

三、 表的导入导出

在数据库的日常维护中,表的导入导出时很频繁的一类操作。

1. 导出

在某些情况下,为了一些特定的目的,经常需要将表里的数据导出为某些符号分割的纯数据文本,而不是 sql 语句:

1、用来作为 Excel 显示;2、单纯为了节省备份空间;3、为了快速的加载数据,load data 的加载速度比普通 sql 加载要快 20 倍以上。

使用 select ...into outfile ... 命令来导出数据,具体语法如下:

mysql> select * from tablename into outfile 'target_file' [option];其中 option 参数可以是以下选项:

fields terminated by 'string' // 字段分隔符,默认为制表符't'

fields [optionally] enclosed by 'char' // 字段引用符,如果加 optionally 选项则只用在 char、varchar 和 text 等字符型字段上,默认不使用引用符

fields escaped by ‘char’ // 转移字符、默认为 ''

lines starting by 'string' // 每行前都加此字符串,默认''

lines terminated by 'string' // 行结束符,默认为'n'

# char 表示此符号只能是单个字符,string表示可以是字符串。例如,将 test 表中数据导出为数据文本,其中,字段分隔符为“,”,字段引用符为“"”,记录结束符为回车符:

MySQL [t2]> select * from test into outfile '/data/mysql/outfile.txt' fields terminated by "," enclosed by '"';Query OK, 4 rows affected (0.02 sec)zj@bogon:/data/mysql$ more outfile.txt"1","a","helloworld""2","b","helloworld""3","c","helloworld""4","d","helloworld"发现第一列是数值型,如果不希望字段两边用引号引起,则语句改为:

MySQL [t2]> select * from test into outfile '/data/mysql/outfile2.txt' fields terminated by "," optionally enclosed by '"';Query OK, 4 rows affected (0.03 sec)zj@bogon:/data/mysql$ more outfile2.txt1,"a","helloworld"2,"b","helloworld"3,"c","helloworld"4,"d","helloworld"测试转义字符,MySQL 导出数据中需要转义的字符主要包括以下 3 类:

1、转义字符本身 2、字段分隔符 3、记录分隔符

MySQL [t2]> update test set content = '\"##!aa' where id=1;Query OK, 1 row affected (0.05 sec)Rows matched: 1 Changed: 1 Warnings: 0MySQL [t2]> select * from test into outfile '/data/mysql/outfile3.txt' fields terminated by "," optionally enclosed by '"';Query OK, 4 rows affected (0.03 sec)*******************************************zj@bogon:/data/mysql$ more outfile3.txt1,"a","\"##!aa"2,"b","helloworld"3,"c","helloworld"4,"d","helloworld"1、当导出命令中包含字段引用符时,数据中含有转义字符本身和字段引用符的字符需要被转义;

2、当导出命令中不包含字段引用符时,数据中含有转义字符本身和字段分割符的字符需要被转义。

注意:select ... into outfile ... 产生的输出文件如果在目标目录下有重名文件,将不会被创建成功,源文件不会被自动覆盖。

使用 mysqldump 导出数据为文本的具体语法如下:

mysqldump -u username -T target_dir dbname tablename [option]

其中,option 参数可以是以下选项:

1、--fields-terminated-by=name (字段分隔符);

2、--fields-enclosed-by=name (字段引用符);

3、--fields-optionally-enclosed-by=name (字段引用符,只用在 char、varchar 和 test 等字符型字段上);

4、--fields-escaped-by=name (转义字符);

5、--lines-terminated-by=name (记录结束符);

例子:

root@bogon:/usr/local/mysql/bin# ./mysqldump -uroot -p -T /data/mysql/dump t2 test --fields-terminated-by ',' --fields-optionally-enclosed-by '"'**************** test.txt **********************zj@bogon:/data/mysql/dump$ more test.txt1,"a","\"##!aa"2,"b","helloworld"3,"c","helloworld"4,"d","helloworld"***************** test.sql *********************zj@bogon:/data/mysql/dump$ more test.sql-- MySQL dump 10.13 Distrib 5.7.18, for Linux (x86_64)---- Host: localhost Database: t2-- -------------------------------------------------------- Server version 5.7.18-log/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;/*!40101 SET NAMES utf8mb4 */;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;---- Table structure for table `test`--DROP TABLE IF EXISTS `test`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `name` varchar(10) DEFAULT NULL, `content` varchar(100) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;/*!40101 SET character_set_client = @saved_cs_client */;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;-- Dump completed on 2017-09-25 11:14:06可以发现,除多了一个表的创建脚本文件,mysqldump 和 select ... into outfile ... 的选项和语法非常相似。其实 mysqldump 实际调用的就是后者提供的接口,并在其上面添加了一些新的功能而已。

2. 导入

导入用 select ... into outfile 或者 mysqldump 导出的纯数据文本

和导出类似,导入也有两种不同的方法,分别是 load data infile... 和 mysqlimport,它们的本质是一样的,区别只是在于一个在 MySQL 内部执行,另一个在 MySQL 外部执行。

使用 “load data infile...” 命令,具体语法如下

mysql> load data [local]infile 'filename' into table tablename [option] option 可以是以下选项:

1、fields terminated by 'string' (字段分割符,默认为制表符't');

2、fields [optionally] enclosed by 'char' (字段引用符,如果加 optionally 选项则只用在 char varchar text 等字符型字段上。默认不使用引用符);

3、fields escaped by 'char' (转义字符,默认为'')

4、lines starting by 'string' (每行前都加此字符串,默认为'')

5、lines terminated by 'string' (行结束符,默认为'n')

6、ignore number lines (忽略输入文件中的前几行数据)

7、(colnameoruservar,...) (按照列出的字段顺序和字段数量加载数据);8、set col_name = expr,...将列做一定的数值转换后再加载。

fields 、lines 和前面 select...into outfile...的含义完全相同,不同的是多了几个不同的选项,下面的例子将文件'test.txt'中的数据加载到表 test 中:

// 清空表 test MySQL [t2]> truncate table test;Query OK, 0 rows affected (0.07 sec)MySQL [t2]> load data infile '/data/mysql/outfile.txt' into table test fields terminated by ',' enclosed by '"';Query OK, 4 rows affected (0.10 sec)Records: 4 Deleted: 0 Skipped: 0 Warnings: 0MySQL [t2]> select * from test;+------+------+------------+| id | name | content |+------+------+------------+| 1 | a | helloworld || 2 | b | helloworld || 3 | c | helloworld || 4 | d | helloworld |+------+------+------------+4 rows in set (0.00 sec)如果不希望加载文件中的前两行,可以进行如下操作:

MySQL [t2]> truncate table test;Query OK, 0 rows affected (0.02 sec)MySQL [t2]> load data infile '/data/mysql/outfile.txt' into table test fields terminated by ',' enclosed by '"' ignore 2 lines;Query OK, 2 rows affected (0.00 sec)Records: 2 Deleted: 0 Skipped: 0 Warnings: 0MySQL [t2]> select * from test;+------+------+------------+| id | name | content |+------+------+------------+| 3 | c | helloworld || 4 | d | helloworld |+------+------+------------+2 rows in set (0.02 sec)

使用 mysqldump 实现

语法:

shell> mysqlimport -uroot -p [--local] dbname order_tab.txt [option]其中,option 参数可以是以下选项:

1、fields-terminated-by=name (字段分隔符) 2、fields-enclosed-by=name (字段引用符) 3、fields-optionally-enclosed-by=name (字段引用符,只用在 char、varchar、text等字符型字段上) 4、fields-escaped-by=name (转义字符) 5、lines-terminated-by=name (记录结束符) 6、ignore-lines=number (忽略前几行)

注意:如果导入和导出是跨平台操作的(windows 和 linux),那么要注意设置参数 line-terminated-by,windows 上设置为 line-terminated-by='rn', linux 上设置为 line-terminated-by='n'。

原文地址:https://www.toutiao.com/article/6855460778359816715/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示: “兵马未动粮草先行”,看完了相关的配置之后,我们先来创建一张测试表和一些测试数据。 -- 如果存在 person 表先删除 DROP TABLE IF EXISTS person; -- 创建 person 表,其中
&gt; [合辑地址:MySQL全面瓦解](https://www.cnblogs.com/wzh2010/category/1859594.html &quot;合辑地址:MySQL全面瓦解&quot;) # 1 为什么需要数据库备份 - 灾难恢复:当发生数据灾难的时候,需要对损坏的数据进行恢复和
物理服务机的CPU、内存、存储设备、连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈。为了解决这个问题,行业先驱门充分发扬了分而治之的思想,对大库表进行分割,&#xA;然后实施更好的控制和管理,同时使用多台机器的CPU、内存、存储,提供更好的性能。而分治有两种实现方式:垂直拆
1 回顾 上一节我们详细讲解了如何对数据库进行分区操作,包括了 垂直拆分(Scale Up 纵向扩展)和&#160;水平拆分(Scale Out 横向扩展) ,同时简要整理了水平分区的几种策略,现在来回顾一下。 2 水平分区的5种策略 2.1 Hash(哈希) 这种策略是通过对表的一个或多个列的Ha
navicat查看某个表的所有字段的详细信息 navicat设计表只能一次查看一个字段的备注信息,那怎么才能做到一次性查询表的信息呢?SELECT COLUMN_NAME,COLUMN_COMMENT,COLUMN_TYPE,COLUMN_KEY FROM information_schema.CO
文章浏览阅读4.3k次。转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52768613前言:数据库每天的数据不断增多,自动删除机制总体风险太大,想保留更多历史性的数据供查询,于是从小的hbase换到大的hbase上,势在必行。今天记录下这次数据仓库迁移。看下Agenda:彻底卸载MySQL安装MySQL_linux服务器进行数据迁移
文章浏览阅读488次。恢复步骤概要备份frm、ibd文件如果mysql版本发生变化,安装回原本的mysql版本创建和原本库名一致新库,字符集都要保持一样通过frm获取到原先的表结构,通过的得到的表结构创建一个和原先结构一样的空表。使用“ALTER TABLE DISCARD TABLESPACE;”命令卸载掉表空间将原先的ibd拷贝到mysql的仓库下添加用户权限 “chown . .ibd”,如果是操作和mysql的使用权限一致可以跳过通过“ALTER TABLE IMPORT TABLESPACE;”命令恢_alter table discard tablespace
文章浏览阅读225次。当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化:单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量:字段尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNEDVARCHAR的长度只分配_开发项目 浏览记录表 过大怎么办
文章浏览阅读1.5k次。Mysql创建、删除用户MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):1.新建用户登录MYSQL:@>mysql -u root -p@>密码创建用户:mysql> insert into mysql.user(Host,User,Password) values("localhost_删除mysql用户组
MySQL是一种开源的关系型数据库管理系统,被广泛应用于各类应用程序的开发中。对于MySQL中的字段,我们需要进行数据类型以及默认值的设置,这对于数据的存储和使用至关重要。其中,有一个非常重要的概念就是MySQL字段默认字符串。 CREATE TABLE `my_...
MySQL是一个流行的开源关系型数据库管理系统,广泛应用于Web应用程序开发、数据存储和管理。在使用MySQL时,正确设置字符集非常重要,以确保数据的正确性和可靠性。 在MySQL中,字符集表示为一系列字符和字母的集合。MySQL支持多种字符集,包括ASCII、UTF...
MySQL存储函数 n以内偶数 MySQL存储函数能够帮助用户简化操作,提高效率,常常被用于计算和处理数据。下面我们就来了解一下如何使用MySQL存储函数计算n以内的偶数。 定义存储函数 首先,我们需要定义一个MySQL存储函数,以计算n以内的偶数。下...
MySQL是一个流行的关系型数据库管理系统,基于客户机-服务器模式,可在各种操作系统上运行。 MySQL支持多种字符集,不同的字符集包括不同的字符,如字母、数字、符号等,并提供不同的排序规则,以满足不同语言环境的需求。 //查看MySQL支持的字符集与校对规...
在MySQL数据库中,我们有时需要对特定的字符串进行截取并进行分组统计。这种操作对于数据分析和报表制作有着重要的应用。下面我们将讲解一些基本的字符串截取和分组统计的方法。 首先,我们可以使用substring函数对字段中的字符串进行截取。假设我们有一张表stude...
MySQL提供了多种字符串的查找函数。下面我们就一一介绍。 1. LIKE函数 SELECT * FROM mytable WHERE mycolumn LIKE 'apple%'; 其中"apple%"表示以apple开头的字符串,%表示任意多个字符...
MySQL 是一种关系型数据库管理系统,广泛应用于各种不同规模和类型的应用程序中。在 MySQL 中,处理字符串数据是很常见的任务。有时候,我们需要在字符串的开头添加一定数量的 0 ,以达到一定的位数。比如,我们可能需要将一个数字转换为 4 位或 5 位的字符串,不足的...
MySQL是一种流行的关系型数据库管理系统,支持多种数据类型。以下是MySQL所支持的数据类型: 1. 数值型数据类型: - TINYINT 保存-128到127范围内的整数 - SMALLINT 保存-32768到32767范围内的整数 - MEDIU...
MySQL中存储Emoji表情字段类型 在现代互联网生态中,表情符号已经成为人们展示情感和思想的重要方式之一,因此将表情符号存储到数据库中是一个经常出现的问题。MySQL作为最流行的开源关系型数据库管理系统之一,也需要能够存储和管理这些表情符号的字段类型。 UT...
MySQL是一种关系型数据库管理系统。在MySQL数据库中,有多种不同的数据类型。而其中,最常见的数据类型之一就是字符串类型。在MySQL中,字符串类型的数据通常会被存储为TEXT或VARCHAR类型。 首先,让我们来看一下VARCHAR类型。VARCHAR是My...
MySQL字符串取整知识详解 MySQL是一种开源的关系型数据库管理系统,广泛应用于各个领域。在使用MySQL过程当中,我们经常需要对数据进行取整操作。本文将介绍如何使用MySQL字符串取整来处理数据取整问题。 什么是MySQL字符串取整? MySQL...