如果平时没有接触到数据库,或者接触数据库不够深入,那么这篇文章很适合你,这篇文章主要从关系性和非关系型数据库的适用场景出发,介绍了MySQL,MongoDB,Redis数据库的安装,备份和常用命令以及MySQL的性能测试,作为一个测试工程师,通过该篇文档可以对数据库有个大体框架
在当今的互联网中,最常见的数据库模型主要是两种,即SQL关系型数据库和NoSQL非关系型数据库。
关系型数据库是一种基于关系模型的数据管理系统,数据通过多个表以及表之间的关系进行存储和查询。其原理包括:
非关系型数据库也称为NoSQL数据库,通过键值对(key-value)、文档、图形等形式来存储和查询数据,并没有固定的模式。其原理包括:
关系型数据库适合处理事务性的数据,如银行账户等,支持复杂的查询操作、数据完整性以及数据一致性要求高的场景。非关系型数据库适合处理非结构化数据,如社交网络、实时日志等,可支持快速读写、横向扩展等特点。需要根据实际业务需求和数据特点选择适合的数据库系统。
常用的关系型数据库包括:
MySQL:开源免费的关系型数据库,提供高性能、高可靠性和可伸缩性。
Oracle:商业产品,支持大规模的企业级应用。
SQL Server:微软公司推出的数据库管理系统,具有强大的安全性和企业级管理功能。
PostgreSQL:开源免费的关系型数据库,被誉为世界上最先进的开源数据库之一。
常用的非关系型数据库包括:
MongoDB:开源免费的基于文档的数据库,支持海量数据存储和高并发读写。
Redis:高性能的Key-Value存储数据库,用于存储、缓存和消息队列等各种场景。
cd /usr/local/src
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
xz -d mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar
mkdir /usr/local/mysql
mv /usr/local/src/mysql-8.0.20-linux-glibc2.12-x86_64/* /usr/local/mysql
cd /usr/local/mysql
groupadd mysql
useradd -g mysql mysql
chown -R mysql.mysql /usr/local/mysql
vim /etc/my.cnf,按 i 进入修改模式 然后将下面的文本复制进去
[mysqld]
user=root
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
max_connections=200
max_connect_errors=10
character-set-server=utf8
default-storage-engine=INNODB
default_authentication_plugin=mysql_native_password
lower_case_table_names=1
group_concat_max_len=102400
[mysql]
default-character-set=utf8
[client]
port=3306
default-character-set=utf8
复制进去后按esc退出修改模式,然后按 shift+: 然后输入wq保存文件
cd bin
./mysqld --initialize
如果提示 :
./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
就执行下下面这个再执行初始化
yum -y install numactl
cp -a ./support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql
service mysql start
ln -s /usr/local/mysql/bin/mysql /usr/bin
mysql -uroot -p
输入刚刚初始化时生成的密码
更改root用户密码, 注意语句后的; 执行语句忘记写了 可以补个空的;回车也可以将语句执行
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
flush privileges;
use mysql;
update user set host='%' where user = 'root';
flush privileges;
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
#示例:一行 SQL 语句
UPDATE user SET username='robot', password='robot' WHERE username = 'root';
#示例:多行 SQL 语句
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
4.SQL 支持三种注释
## 注释1
– 注释2
/* 注释3 */
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是定义数据库对象,DDL 的核心指令是 CREATE、ALTER、DROP。
CREATE DATABASE test;
CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;
DROP DATABASE test;
USE test;
SHOW DATABAES;
SHOW TABLES;
CREATE TABLE test_user (
id int(10) NOT NULL COMMENT 'Id',
username varchar(64) NOT NULL DEFAULT 'dada' COMMENT '用户名',
password varchar(64) NOT NULL DEFAULT '*****' COMMENT '密码'
) COMMENT='测试用户表';
CREATE TABLE vip_user AS
SELECT * FROM user;
ALTER TABLE test_user ADD age int(3);
ALTER TABLE test_user DROP COLUMN age;
WHERE 用于过滤记录,用于缩小访问数据的范围,常结合 SELECT,UPDATE 和 DELETE 一起使用。在WHERE中可以使用运算操作符,返回 true 或 false 的条件。
SELECT * FROM test_user
WHERE username = 'A';
UPDATE test_user
SET username = 'B'
WHERE username = 'A';
DELETE FROM test_user
WHERE username = 'B';
SELECT * FROM test_user WHERE username IN ('A', 'B');
SELECT * FROM test_user WHERE id BETWEEN 3 AND 5;
SELECT * FROM test_user WHERE username LIKE '%appl%';
SELECT * FROM test_user WHERE username LIKE '__pple';
AND.OR.NOT 是用于对过滤条件的逻辑处理指令,且AND 优先级高于 OR,为了明确处理顺序,可以使用 ()。
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_id = '001' AND prod_price <= 50;
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_id = '001' OR prod_id = '001';
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 1 AND 100;
MySQL数据库的导出备份和导入还原可以通过命令行方式和图形化界面工具方式实现。
命令行方式:
mysqldump -u [用户名] -p [密码] [数据库名] > [导出文件名].sql
# 示例:导出整个数据库
mysqldump -u root -p123456 mydb > mydb_backup.sql
# 示例:导出指定表
mysqldump -u root -p123456 mydb mytable > mytable_backup.sql
mysql -u [用户名] -p [密码] [数据库名] < [导入文件名].sql
# 示例:还原整个数据库
mysql -u root -p123456 mydb < mydb_backup.sql
# 示例:还原指定表
mysql -u root -p123456 mydb < mytable_backup.sql
请先访问sysbench官网并下载sysbench软件包,或者如果你使用的是Linux系统,也可以使用以下命令来安装sysbench:
# 安装:
yum install -y sysbench
# 查看版本:
sysbench --version
使用mysql命令来连接mysql服务:
mysql -u root -p
登录成功后,输入以下命令来创建一个测试数据库:
CREATE DATABASE test;
接下来,使用以下命令在test数据库中创建一个测试表:
USE test;
CREATE TABLE sbtest (
id INT PRIMARY KEY NOT NULL,
k INT NOT NULL,
c CHAR(120) NOT NULL,
pad CHAR(60) NOT NULL
);
以下是一个简单的sysbench基准测试命令:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> prepare
其中,“password”应替换为你的mysql root用户密码。此命令将为sysbench测试准备一个数据库。
接下来,运行sysbench实际测试:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> --num-threads=<threads> --max-time=<time> run
其中,“threads”是并发线程的数量,“time”是执行测试的总时间。
最后,使用以下命令清理:
sysbench --test=oltp --db-driver=mysql --mysql-db=test --mysql-user=root --mysql-password=<password> cleanup
MongoDB是一种文档数据库,属于NoSQL数据库的一种,基于分布式文件存储的NoSQL数据库,由C++语言编写。MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,即键值对的集合。MongoDB支持的查询方式也很灵活,可以进行范围查询、正则表达式查询、任意深度的嵌套查询等。MongoDB具有高性能、可扩展性和灵活性等特点,适合应用于WEB应用、大数据、移动应用等领域。
典型的应用场景:
大数据处理和存储:MongoDB可以轻松处理海量的数据,方便进行大数据的存储和管理。
物联网应用:物联网应用产生了海量的数据,而MongoDB提供的高性能和可扩展性,非常适合物联网应用相关的数据处理和存储。
实时分析:MongoDB支持快速查询和聚合操作,能够实现实时分析。
社交网络:社交网络应用存在大量的用户数据,MongoDB能够快速处理和查询这些数据。
大规模电子商务:电子商务网站需要管理大量的数据,MongoDB能够提供高可用性、高性能、可扩展性,为电子商务应用提供强有力的支持。
从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:
https://www.mongodb.com/download-center/community
上传到linux服务器上,将其解压:
tar -zxvf mongodb-linux-x86_64-rhel70-5.0.16-rc0.tgz
mv -r mongodb-linux-x86_64-5.0.16 /usr/local/mongodb
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
注意保存后要重启系统配置:
source /etc/profile
cd /usr/local/mongodb
sudo mkdir p data/dbsudo chmod r 777 data/db
sudo mkdir logs
cd logs
touch mongodb.log
cd /usr/local/mongodb/bin
sudo vi mongodb.conf
插入下列内容:
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true #以守护程序的方式启用,即在后台运行
cd /usr/local/mongodb/bin
./mongod -f mongodb.conf
安装好mongo后,本地输入mongo即可进入mongo的页面,远程连接可以Mongo 远程链接地址,连接到mongo
进入mongo后,输入help可以查看mongo提供的帮助
MongoDB 是一个面向文档的 NoSQL 数据库,因此,在查询 MongoDB 数据库中的数据时,最基本的单位是文档对象(document),而集合(collection)则是文档对象的容器,而数据库(database)则是多个集合(collection)的容器,下面是 MongoDB 数据库级别、集合级别、文档级别及其对应的操作命令和示例:
数据库级别指的是 MongoDB 中的多个集合(collection)所共同隶属的一个数据库(database)。
操作命令:
use database_name
show collections
db.stats()
集合级别指的是 MongoDB 中的所有文档对象的容器。
操作命令:
db.createCollection('collection_name')
db.collection_name.insert(document)
db.collection_name.find()
db.collection_name.count()
示例:
db.createCollection('students')
db.students.insert({'name': 'John', 'age': 25})
db.students.insert({'name': 'Bill', 'age': 30})
db.students.find()
db.students.count()
文档级别指的是 MongoDB 中存储的全部数据的最小单位,即文档对象。
操作命令:
db.collection_name.update(query, update, options)
db.collection_name.remove(query)
db.collection_name.count()
示例:
db.students.update({'name': 'John'}, {'name': 'John Smith'})
db.students.remove({'name': 'Bill'})
db.students.count()
查询结果集的操作命令用于对查询到的结果集进行一些操作。
操作命令:
db.collection_name.find(query)
db.collection_name.find().sort(sort_fields)
db.collection_name.find().skip(skip_count).limit(page_size)
示例:
db.students.find({'age': {'$gt': 25}})
db.students.find().sort({'age': 1})
db.students.find().skip(0).limit(10)
MongoDB是一种NoSQL数据库,它使用JSON样式的文档来保存数据。当你需要备份,恢复或导出MongoDB数据时,你可以使用以下方法:
mongodump是MongoDB提供的一个命令行工具,可以备份整个数据库或者指定的集合。以下是mongodump的命令:
mongodump --host --port --username --password --db --collection --out
例如,备份名为test的数据库到/home/mongodb/backups目录:
mongodump --db test --out /home/mongodb/backups
除了mongodump命令,MongoDB还提供了一些管理工具,例如MongoDB Compass和Studio 3T。可以使用这些工具进行备份数据。以下是MongoDB Compass备份数据的步骤:
mongorestore是MongoDB提供的一个命令行工具,可以恢复备份的数据。以下是mongorestore的命令:
mongorestore --host --port --username --password --db --collection
例如,恢复名为test的数据库备份文件:
mongorestore --db test /home/mongodb/backups/test/
与备份数据一样,可以使用MongoDB Compass或Studio 3T等管理工具恢复数据。以下是MongoDB Compass恢复数据的步骤:
mongoexport是MongoDB提供的一个命令行工具,可以将指定的集合导出为JSON、CSV和TSV文件格式。以下是mongoexport的命令:
mongoexport --host --port --username --password --db --collection --type --out
例如,导出名为test的数据库中名为users集合的数据到/home/mongodb/export目录:
mongoexport --db test --collection users --type json --out /home/mongodb/export/users.json
可以使用MongoDB Compass或Studio 3T等管理工具导出数据。以下是MongoDB Compass导出数据的步骤:
Redis 是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。由 C 语言开发的一个开源的高性能
键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
官网地址:https://redis.io/
中文官方地址:http://www.redis.cn/
Redis作为一个高性能键值数据库,适用场景主要包括:
缓存:Redis最常用的场景就是缓存。将经常使用的数据存储在Redis中,减少访问后端数据源的次数,从而提高应用的性能。
消息队列:Redis支持发布/订阅模式,可以将它作为一个消息队列使用,实现异步处理任务,并且可以设置消息失效时间。
计数器:Redis支持以原子方式进行增减操作,因此可以用作计数器,如统计网站访问量、商品销量等。
分布式锁:Redis可以通过SETNX命令实现单节点上的分布式锁,并且Redis提供了Redlock算法实现多节点之间的分布式锁。
数据存储:除了键值对类型,Redis还支持其他数据结构,如列表、哈希表、集合等,可以像使用普通数据结构一样存储数据,同时也支持持久化。
地图信息:Redis自带的Geo命令可以支持地图相关的操作,如查询地理位置,计算距离等。
与MongoDB对比,其区别如下:
数据类型:MongoDB是一种文档型数据库,每个文档可以包含不同类型的数据,如数组、嵌入式文档、日期等。Redis则是一种键值数据库,存储键值对。
数据持久性:MongoDB支持数据持久化,可以将数据存储在硬盘上,即使服务器崩溃也不会丢失数据。Redis默认将数据存储在内存中,支持将数据异步保存到硬盘上进行持久化。
数据查询:MongoDB拥有强大的查询功能,支持复杂的查询语句,可以查询嵌套的文档和数组。Redis则只支持基本的查询操作,如添加、更新和删除。
性能表现:Redis比MongoDB更快,因为Redis将数据存储在内存中,而MongoDB需要从硬盘读取数据。
总之,MongoDB适用于需要存储复杂数据结构和进行复杂查询的场景,而Redis则适用于对速度和响应时间要求高的场景。
EPEL 的全称叫 Extra Packages for Enterprise Linux。它是由 Fedora 社区打造,为 RHEL 及衍生发行版,如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL 之后,就相当于添加了一个第三方源。
为什么需要 EPEL?那是因为 CentOS 源包含的大多数的库都是比较旧的,并且很多流行的库也不存在,而EPEL 在其基础上不仅全,而且还够新。
# 服务相关命令
systemctl start redis
systemctl restart redis
systemctl stop redis
firewall-cmd --zone=public --add-port=6379/tcp --permanent
在终端输入以下命令即可启动Redis:
# 本地启动
redis-cli
# 远程启动
redis-cli -h host -p port -a password
使用FLUSHALL命令可以清空redis中的所有键值:
FLUSHALL
使用KEYS命令可以查询redis中符合指定模式的键值,例如查询所有以“user”开头的键值:
KEYS user*
SET key value
例如:
SET name "Tom"
GET key
例如:
GET name
LPUSH key value
例如:
LPUSH fruits apple
RPUSH key value
例如:
RPUSH fruits orange
LRANGE key start stop
例如:
LRANGE fruits 0 -1
SADD key member
例如:
SADD fruits banana
SMEMBERS key
例如:
SMEMBERS fruits
ZADD key score member
例如:
ZADD fruits 2 cherry
ZRANGE key start stop
例如:
ZRANGE fruits 0 -1
HSET key field value
例如:
HSET user:1 name Tom
HGETALL key
例如:
HGETALL user:1
使用EXPIRE命令可以设置redis中的键值过期时间,单位为秒:
EXPIRE key seconds
例如:
EXPIRE name 3600
Redis提供了两种数据备份方式:RDB(Redis Database) 和 AOF(Append Only File)。下面分别介绍如何使用这两种方式进行数据备份和恢复:
RDB是Redis默认的数据备份方式,它会定期将当前内存中的数据保存到磁盘上的RDB文件中。
可以使用redis-cli客户端执行SAVE命令来手动备份数据:
$ redis-cli
127.0.0.1:6379> SAVE
OK
执行以上命令后,Redis会在当前工作目录下生成一个dump.rdb文件,其中保存了当前Redis数据库的快照。
将备份的RDB文件复制到Redis服务器所在的目录中,然后重启Redis服务器即可恢复数据。Redis会自动加载RDB文件并恢复数据。
AOF是一种更加安全的数据备份方式,它会将每一条写命令追加到AOF文件的末尾,以保证数据的持久化。
可以使用redis-cli客户端执行BGSAVE命令来异步备份数据到磁盘上的AOF文件中:
$ redis-cli
127.0.0.1:6379> BGSAVE
Background saving started
执行以上命令后,Redis会在后台异步进行备份操作,期间可以继续对Redis进行读写操作。备份完成后,Redis会在日志中打印出相应的日志信息。
使用AOF方式备份数据时,如果服务器出现异常宕机,可以通过AOF文件中的操作记录来恢复数据。启动Redis服务器后,Redis会自动加载AOF文件并恢复数据。如果AOF文件过大,可以先使用BGREWRITEAOF命令来将AOF文件进行压缩。
缓存穿透是指查询一个不存在的数据时,在缓存中找不到,从而导致查询转到后端数据库,这时大量的请求可能会造成数据库压力过大,甚至会导致宕机。缓存穿透的解决方案可以采用Bloom Filter算法、预加载技术等来防止非法请求进入数据库。
缓存雪崩是指由于缓存中很多数据的失效时间相同,从而导致在同一时间大量的请求到达数据库。缓存雪崩的解决方案包括采用分布式缓存、随机缓存失效时间等来防止失效时间集中在同一时间导致的失效压力。
对于缓存穿透和缓存雪崩问题,可以采取以下解决方案:
- 缓存穿透:可以使用布隆过滤器对缓存查询进行过滤,或者将查询结果为空的值也缓存下来(称为“缓存空对象”)。
- 缓存雪崩:可以采用将缓存过期时间设置为随机时间,或者将数据存储在多个缓存服务器中以防止同时失效。