MySQL运维实战(3.3) 管理数据库(database)

作者:俊达

引言

数据库的创建和管理是构建可靠数据的关键,关系到所存储数据的安全与稳定。在 MySQL 这个强大的关系型数据库系统中,数据库的创建与管理需要精准的步骤和妥善的配置。下面,将深入探讨如何使用MySQL 来管理数据库,我们不仅关注了基础的语法操作,还涉及了一些潜在的问题及实践,从创建数据库、授予权限到处理数据库名称大小写问题,再到配置数据库的属性等,带你走进数据库管理的正式通道。

1 创建数据库

使用create database语句创建数据库,用户拥有create权限才能创建数据库。

-- 例子:创建dba用户,拥有创建数据库名称为db_x的权限
mysql> create user 'dba'@'%' identified by 'dba';
Query OK, 0 rows affected (0.00 sec)mysql>  grant create on `db\__`.* to 'dba'@'%';
Query OK, 0 rows affected (0.00 sec)

授权时可指定授权的数据库名称,使用*表示所有数据库,使用_匹配一个字符,使用%匹配任意数量的字符。使用反斜杠()对_和%进行转意。
使用刚刚创建的账号创建数据库

[root@box3 ~]# mysql -udba -pdba -h172.16.20.51
Welcome to the MySQL monitor.  Commands end with ; or \g.mysql> create database biz_db;
ERROR 1044 (42000): Access denied for user 'dba'@'%' to database 'biz_db'mysql> create database db02;
ERROR 1044 (42000): Access denied for user 'dba'@'%' to database 'db02'mysql> create database db_x;
Query OK, 1 row affected (0.00 sec)mysql> create database db_y;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_x               |
| db_y               |
+--------------------+mysql> show grants;
+----------------------------------------+
| Grants for dba@%                       |
+----------------------------------------+
| GRANT USAGE ON *.* TO 'dba'@'%'        |
| GRANT CREATE ON `db\__`.* TO 'dba'@'%' |
+----------------------------------------+

创建数据库之后,会在datadir指定的路径创建数据库同名目录

mysql> show variables where variable_name in ('datadir');
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |[root@box1 mysql]# ls -ld /var/lib/mysql/db_*
drwxr-x---. 2 mysql mysql 20 4月   6 22:53 /var/lib/mysql/db_x
drwxr-x---. 2 mysql mysql 20 4月   6 22:58 /var/lib/mysql/db_y

2 数据库名称的大小写问题

数据库名称是否区分大小写?这跟文件系统文件名是否区分大小写有关。
linux系统下(ext系统文件系统、xfs),文件名称区分大小写,默认lower_case_tables_names设置为0,mysql数据库名称区分大小写。

mysql> show variables like '%lower_case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+mysql> create database biz_db;
Query OK, 1 row affected (0.00 sec)mysql> create database Biz_db;
Query OK, 1 row affected (0.00 sec)mysql> show databases like '%iz%';
+-----------------+
| Database (%iz%) |
+-----------------+
| Biz_db          |
| biz_db          |
+-----------------+mysql> use BIZ_DB
ERROR 1049 (42000): Unknown database 'BIZ_DB'mysql> use Biz_db
Database changed[root@box1 mysql]# ls -ld /var/lib/mysql/*iz_db
drwxr-x---. 2 mysql mysql 20 4月   6 23:03 /var/lib/mysql/biz_db
drwxr-x---. 2 mysql mysql 20 4月   6 23:03 /var/lib/mysql/Biz_db

lower_case_file_system是一个只读参数。会根据mysql所在文件系统的特性设置相应的值。

mysql> set global lower_case_file_system=ON;
ERROR 1238 (HY000): Variable 'lower_case_file_system' is a read only variable

如果把lower_case_file_system配置到配置文件,实例会无法启动

[root@box1 mysql]# service mysqld restart
Redirecting to /bin/systemctl restart mysqld.service
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.2021-04-07T03:14:52.203804Z 0 [ERROR] unknown variable 'lower_case_file_system=ON'
2021-04-07T03:16:09.587798Z 0 [ERROR] unknown option '--lower_case_file_system'
2021-04-07T03:18:06.738497Z 0 [ERROR] unknown option '--lower-case-file-system'

如果参数lower_case_table_names设置为1,则数据库名称和表名不区分大小写。

mysql> show variables like '%lower_case%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 1     |
+------------------------+-------+
2 rows in set (0.03 sec)mysql> create database USER_DB;
Query OK, 1 row affected (0.01 sec)mysql> create database user_db;
ERROR 1007 (HY000): Cant create database 'user_db'; database exists[root@box1 mysql]# ls -ld /var/lib/mysql/*db
drwxr-x---. 2 mysql mysql 20 4月   7 01:35 /var/lib/mysql/user_db

注意事项

对已有的数据库实例修改lower_case_table_names参数,可能会出现问题。

1、lower_case_table_names从0改到1
将参数从0改成1,如果原来的数据库中存在大写的数据库名或表名,修改参数后将无法访问这些数据库和表。

mysql> show variables like '%lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 1     |
+------------------------+-------+mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ORDER_DB           |mysql> use ORDER_DB;
ERROR 1049 (42000): Unknown database 'order_db'

2、lower_case_table_names从1改到0
将参数从1改成0,则原先的库、表都是以小写方式存在。如果SQL语句中使用大写的方式访问这些库表,会报错。

mysql> show variables like '%lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| tab           |
+---------------+
1 row in set (0.00 sec)mysql> select * from Tab;
ERROR 1146 (42S02): Table 'db1.Tab' doesnt existmysql> select * from tab;
+------+------+
| col  | COL2 |
+------+------+
| tab  | tab  |
+------+------+
1 row in set (0.00 sec)

3、将数据库迁移到不同的环境时,如果新老环境的lower_case_table_names参数不一样,则有可能会发生问题。
比如windows和linux环境下,lower_case_table_names参数的默认值不一样,换操作系统时,可能会遇到问题。
4、建议将所有环境的lower_case_table_names参数都设置成1。 数据库名称、表的名称只使用小写字符。

关于windows

在windows系统中,文件名不区分大小写,默认lower_case_table_names也为1,对应的数据库也不区分大小写。

mysql> show variables like '%lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | ON    |
| lower_case_table_names | 1     |
+------------------------+-------+
2 rows in set, 1 warning (0.00 sec)mysql> create database biz_db;
Query OK, 1 row affected (0.00 sec)mysql> create database Biz_db;
ERROR 1007 (HY000): Cant create database 'biz_db'; database existsmysql> create database ORDER_DB;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| biz_db             |
| mysql              |
| order_db           |
| performance_schema |
| sys                |
+--------------------+

3 数据库的属性

创建数据库时,可以指定数据库的默认字符集和排序规则。

mysql> create database db_0;
Query OK, 1 row affected (0.00 sec)mysql> create database db_1 default charset utf8;
Query OK, 1 row affected (0.00 sec)mysql> create database db_2 default charset utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)mysql> show create database db_0;
+----------+-----------------------------------------------------------------+
| Database | Create Database                                                 |
+----------+-----------------------------------------------------------------+
| db_0     | CREATE DATABASE `db_0` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.00 sec)mysql> show create database db_1;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| db_1     | CREATE DATABASE `db_1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)mysql> show create database db_2;
+----------+--------------------------------------------------------------------------------+
| Database | Create Database                                                                |
+----------+--------------------------------------------------------------------------------+
| db_2     | CREATE DATABASE `db_2` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+--------------------------------------------------------------------------------+

数据库的字符集和collate属性保存在数据库目录下的db.opt文件中(8.0版本的机制有所变化,不再有db.opt文件,元数据存储在系统表中,系统表的存储引擎为innodb)

[root@box1 mysql]# ls -l /var/lib/mysql/db_?/db.opt
-rw-r-----. 1 mysql mysql 65 4月   7 02:07 /var/lib/mysql/db_0/db.opt
-rw-r-----. 1 mysql mysql 61 4月   7 02:07 /var/lib/mysql/db_1/db.opt
-rw-r-----. 1 mysql mysql 54 4月   7 02:07 /var/lib/mysql/db_2/db.opt[root@box1 mysql]# more /var/lib/mysql/db_?/db.opt
::::::::::::::
/var/lib/mysql/db_0/db.opt
::::::::::::::
default-character-set=latin1
default-collation=latin1_swedish_ci
::::::::::::::
/var/lib/mysql/db_1/db.opt
::::::::::::::
default-character-set=utf8
default-collation=utf8_general_ci
::::::::::::::
/var/lib/mysql/db_2/db.opt
::::::::::::::
default-character-set=utf8
default-collation=utf8_bin

mysql建表时如果不指定字符集和collate,会使用所在数据库的默认字符集和collate。
建议创建数据库的时候 就指定数据库的字符集和collate。

4 数据库其他相关操作

1.切换当前数据库

在mysql client中,使用use命令切换当前数据库。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db_0               |
| db_1               |
| db_2               |mysql> use db_0;
Database changed

2.查看当前数据库

使用函数database()或schema()查看会话当前所在数据库

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changedmysql> select schema();
+----------+
| schema() |
+----------+
| mysql    |
+----------+
1 row in set (0.00 sec)mysql> select database();
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)

3.修改数据库默认属性

mysql> alter database db_0 default charset utf8;
Query OK, 1 row affected (0.00 sec)mysql> show create database db_0;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| db_0     | CREATE DATABASE `db_0` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)mysql> alter database db_0 default collate utf8_bin;
Query OK, 1 row affected (0.00 sec)mysql> show create database db_0;
+----------+--------------------------------------------------------------------------------+
| Database | Create Database                                                                |
+----------+--------------------------------------------------------------------------------+
| db_0     | CREATE DATABASE `db_0` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> alter database db_0 default collate latin1_bin;
Query OK, 1 row affected (0.00 sec)mysql> show create database db_0;
+----------+------------------------------------------------------------------------------------+
| Database | Create Database                                                                    |
+----------+------------------------------------------------------------------------------------+
| db_0     | CREATE DATABASE `db_0` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_bin */ |
+----------+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4.删除数据库

使用drop命令删除数据库。删除需要drop权限。经过测试,5.7.32版本,需要drop on *.*的权限才能成功执行drop database命令。

grant drop on *.* to 'dba'@'%';[root@box3 ~]# mysql -udba -pdba -h172.16.20.51
mysql> drop database db_0;
Query OK, 0 rows affected (0.00 sec)

账号有db_2的drop权限,但无法删除该数据库:

mysql> show grants;
+----------------------------------------------+
| Grants for dba@%                             |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'dba'@'%'              |
| GRANT DELETE, DROP ON `mysql`.* TO 'dba'@'%' |
| GRANT CREATE ON `db\__`.* TO 'dba'@'%'       |
| GRANT DROP ON `db_1`.* TO 'dba'@'%'          |
| GRANT DROP ON `db_x`.* TO 'dba'@'%'          |
| GRANT DROP ON `db_2`.* TO 'dba'@'%'          |
+----------------------------------------------+
6 rows in set (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_2               |
| mysql              |
+--------------------+
3 rows in set (0.00 sec)mysql> drop database db_2;
ERROR 1044 (42000): Access denied for user 'dba'@'%' to database 'db_2'

删除数据库是一项高危操作,生产环境下需要严格规范删除数据库的操作流程,以下是一些关键点需要注意:
1、权限控制:严格控制drop database的权限,确保只有授权人员能够执行这一操作。
2、递归删除:drop database会递归删除数据库内的所有对象,包括表、视图等。执行前需确认清楚删除的对象。
3、性能影响:在数据库内有大量表或表占用大量空间时,drop database可能对数据库实例性能产生负面影响,影响正常业务访问。需在低峰期执行,或者考虑分阶段删除。
4、误删除恢复:误删除后的恢复比较耗时,因此在执行drop database前,应该经过仔细确认和备份,以减少误操作的可能性。
5、备份策略:始终确保有可靠的数据库备份。如果没有备份,误删除可能导致数据无法恢复。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/613191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP企业物资管理系统源码带文字安装教程

PHP企业物资管理系统源码带文字安装教程 技术架构 主要框架 : PHP7.0 laravel5.4  mysql5.5.36 composer1.3.2(依赖管理) 前端 : jquery bootstrap jstree(树形结构) echart(图表) layer(弹出层) 企…

JavaScript递归技巧的前世今生:深入解析递归及其与堆栈的关系

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 递归作为一种能够用简洁的方式定义复杂对象的编程技巧,在计算机科学中被广泛应用。它借助系…

OpenHarmony南向之LCD显示屏

OpenHarmony南向之LCD显示屏 概述 LCD(Liquid Crystal Display)驱动,通过对显示器上下电、初始化显示器驱动IC(Integrated Circuit)内部寄存器等操作,使其可以正常工作。 HDF Display驱动模型 LCD器件驱…

示例说明 Makefile 中的 $(@F),及其用法示例$$dir $@ $< $^ %.c

备忘一个不错的开源编辑器CudaText 下载网址: CudaText - Browse /release at SourceForge.net CudaText 主页: CudaText - Home 1,含义及验证 在 Makefile 中,$(F) 表示当前规则的目标文件名(不包括路径部分&…

都2024年了,FP卖家还不知道AB站怎么玩?

自从开始写FP独立站各种运营技巧和黑科技的文章,经常都会有朋友来私V,询问怎么进行AB站跳转。 可能是现在平台对于FP商家的限制越来越多,再加上如今到处都是“内卷”的电商环境,让FP商家生存越来越艰难,今天就着重讲一…

【踩坑】JDK1.8 AudioSystem 无法关闭流的问题

文章目录 一、前言二、开始狼人杀嫌疑人1:嫌疑人2: 三、复盘Jdk8原生bug解决方法和原理解析 一、前言 做了一个基于文字转语言的小接口,想删除本地wav文件来着,结果发现删除不了。 很明显被占用了,还是被Java占用了……

Linux内核源码分析(强烈推荐收藏!)

前言:Linux内核是由林纳斯托瓦兹(Linus Torvalds)在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机,开始编写一个操作系统内核,并将其命名为Linux。随后,越来越多的开发者加入到项…

【论文】:ALOHA双手远程操作手臂

对于机器人来说,诸如穿扎带或插入电池等精细操作任务是众所周知的困难,因为它们需要精确度、接触力的仔细协调以及闭环视觉反馈。执行这些任务通常需要高端机器人、精确的传感器或仔细的校准,这些可能既昂贵又难以设置。学习能否使用低成本且…

计算机组成原理之计算机硬件发展和计算机系统的组成

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

算法第4版 第2章排序

综述:5个小节,四种排序应用,初级排序、归并排序、快速排序、优先队列 2.1.初级排序 排序算法模板,less(), exch(), 排序代码在sort()方法中; 选择排序:如升序排列,1.找到数组中最小的元素&am…

llama_index 创始人为我们展示召回提升策略(提升15%)

用句子向量替换为句子向量 句子检索,将句子转化为向量。在检索的过程中,假如句子命中,则将句子周围的内容也当做检索内容。 对比句子检索和之前的按块去做切分的检索。可以看到,内容的相关性提升了8%, 构建数据的时候…

如何利用ChatGPT快速生成月报?

随着每个月的结束,个人和团队经常需要编写月报来回顾和总结。这项任务通常消耗大量时间和精力。幸运的是,借助ChatGPT,这个过程可以变得更加简单和高效。接下来,我将详细介绍如何利用ChatGPT快速生成月报,从而帮助你节…

NSSCTF Interesting_include

开启环境: 通过审计,我们可知: flag在flag.php中,可以利用php中伪协议 payload:?filterphp://filter/readconvert.base64-encode/resourceflag.php 将其base64解码就是flag. NSSCTF{3dc54721-be9e-444c-8228-7133fba76ad4}

大数据系列之:腾讯云服务器性能和价格比较

大数据系列之:腾讯云服务器性能和价格比较 一、磁盘性能和价格比较二、高性能云硬盘三、ssd云硬盘四、极速型ssd云硬盘五、增强型ssd云硬盘六、查看腾讯云服务器价格 一、磁盘性能和价格比较 磁盘名称高性能ssd云硬盘极速型ssd云硬盘增强型ssd云硬盘规格500g 5800 …

PyTorch简单理解ChannelShuffle与数据并行技术解析

目录 torch.nn子模块详解 nn.ChannelShuffle 用法与用途 使用技巧 注意事项 参数 示例代码 nn.DataParallel 用法与用途 使用技巧 注意事项 参数 示例 nn.parallel.DistributedDataParallel 用法与用途 使用技巧 注意事项 参数 示例 总结 torch.nn子模块详…

Navicat 技术干货 | 为 MySQL 表选择合适的存储引擎

MySQL 是最受欢迎的关系型数据库管理系统之一,提供了不同的存储引擎,每种存储引擎都旨在满足特定的需求和用例。在优化数据库和确保数据完整性方面,选择合适的存储引擎是至关重要的。今天,我们将探讨为 MySQL 表选择合适的存储引擎…

【BetterBench】2024年都有哪些数学建模竞赛和大数据竞赛?

2024年每个月有哪些竞赛? 2024年32个数学建模和数据挖掘竞赛重磅来袭!!! 2024年数学建模和数学挖掘竞赛时间目录汇总 一月 (1)2024年第二届“华数杯”国际大学生数学建模竞赛 报名时间:即日起…

使用组合框QComboBox模拟购物车

1.组合框: QComboBox 组合框:QComboBox 用于存放一些列表项 实例化 //实例化QComboBox* comboBox new QComboBox(this);1.1 代码实现 1.1.1 组合框的基本函数 QComboBox dialog.cpp #include "dialog.h" #include "ui_dialog.h"Dialog::Dialog…

echarts的dispatchAction

触发图表行为,通过dispatchAction触发。例如图例开关legendToggleSelect, 数据区域缩放dataZoom,显示提示框showTip等等。 官网:echarts (在 ECharts 中主要通过 on 方法添加事件处理函数。) events: ECharts 中的事件分为两种…

AC/DC控制电路选型分析

AC/DC控制电路选型,输出功率5W~20W,工作频率50KHz~100KHz UVL0/OVP/SCP/OCP/OLP等多种保护功能可选