格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。
config
文件root
远程登录mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
mysql> UPDATE mysql.user SET host='%' WHERE user='root';
use mysql;
UPDATE user SET authentication_string=PASSWORD("root") WHERE User="root";
flush privileges;
#库部分
create database db02 charset utf8;
# 创建数据库的时候添加属性
show create database db01;
# 查看建库语句
drop database db02;
# 删除数据库db02
alter database db01 charset utf8;
#修改定义库
#表部分
create table student(
sid int '学号',
sname varchar(20) not null comment '学生姓名',
sage tinyint unsigned not null comment '年龄',
sgender enum('m','f') not null default 'm' comment '学生性别',
cometime datetime not null comment '入学时间'
)charset utf8 engine innodb;
#建表语句实例
desc student;
# 查看表中列的定义信息
drop table student;
#删表
alter table student rename stu;
# 修改表名
alter table stu add age int;
# 添加列和列数据类型的定义
alter table stu add test varchar(20),add qq int;
# 添加多个列
alter table stu add classid varchar(20) first;
# 指定位置进行添加列(表首)
alter table stu add phone2 int after sid;
# 指定位置进行添加列(指定列)
alter table stu drop qq;
# 删除指定的列及定义
alter table stu modify sid varchar(20);
# 修改列及定义(列属性)
alter table stu change phone telphone int();
# 修改列及定义(列名及属性)
grant all on *.* to root@'192.168.175.%' identified by '123456';
# 授予root@'192.168.175.%'用户所有权限(非超级管理员)
revoke select on *.* from root@'192.168.175.%';
# 收回select权限
show grants for root@'192.168.175.%';
# 查看权限
insert into stu valus('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456);
insert into stu(classid,birth.sname,sage,sgender,comtime,telnum,qq) values('linux01',1,NOW(),'zhangsan',20,'m',NOW(),110,123456),
('linux02',2,NOW(),'zhangsi',21,'f',NOW(),111,1234567);
# 插入多条数据
update student set sgender='f' where sid=1;
update mysql.user set password=PASSWORD('123456') where user='root' and host='localhost';
delete from student where sid=3;
truncate table student;
# DDL清空表中的内容
alter table student add status enum('1','0') default 1;
# 额外添加一个状态列
update student set status='0' where sid=1;
# 使用update
select * from student where status=1;
# 应用查询存在的数据
了解select的高级用法(不多简述)
特殊的数据库结构
加快数据库表中数据的检索速度,用于确保数据的唯一性。
B树的每个节点都存储关键字和数据,而B+树只有叶子节点存储数据,内部节点仅存储关键字和指向子节点的指针。
B+树因其优越的范围查询性能和索引空间利用率而被广泛用作默认的索引结构。
2024 年 8月 随笔档案 - guixiang - 博客园 (cnblogs.com)
事务 是一组操作,把所有的操作 作为一个整体一起向系统提交 或 撤销操作请求,即这些操作要么同时成功,要么同时失败。
Atomic(原子性)
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
在事务内看到的数据状态都是一样的。
Isolated(隔离性)
Durable(持久性)
A事务已执行,但未提交;B事务查询到A事务的更新后数据;A事务回滚;
A事务执行更新;B事务查询;A事务又执行更新;B事务再次查询时,前后两次数据不一致;---不可重复读
A事务无论执行多少次,只要不提交,B事务查询值都不变;B事务仅查询B事务开始时那一瞬间的数据快照;
mysql默认模式
指一个线程中的事务读取到了另外一个线程中未提交的数据。
指一个线程中的事务读取到了另外一个线程中提交的update的数据。
指一个线程中的事务读取到了另外一个线程中提交的insert的数据。莫名情况下数据增加或减少(出现于可重复读)
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
通过查询条件对某一行进行加锁,commit后解锁
//读锁(共享锁)
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE;
//写锁(排他锁)
SELECT * FROM table_name WHERE ... FOR UPDATE;
当我们进行增删改的时候Innodb是默认给对应行自动加上了写锁的,select查询不会加锁。
在行锁中,写锁和读锁都是其他会话只能查看无法修改该行数据,自己可以修改,但是我们给某一行加了读锁后,其他会话可以给这一行加读锁,不能加写锁。当我们给某一行加了写锁后,其他会话不能给该行加锁
悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务;
乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据;
Redo(重做) | Undo(撤销) |
---|---|
用来记录数据页的物理修改,确保事务提交后数据的一致性,并在系统崩溃时能够恢复数据到提交状态。 | 用来记录事务中数据修改前的状态,以便在事务失败或需要回滚时,能够撤销事务所做的修改,恢复数据到修改前的状态。 |
当系统提交了数据库DML指令,但未执行commit,系统宕机了。此时,数据库的数据不会改变,数据库连接会被清除,数据库事务也会被清除,也不会锁定数据
MySQL数据库管理系统中负责存储和检索数据的组件,它们可以影响数据的存储方式、事务支持、并发性能等方面1。MySQL中常见的存储引擎有MyISAM、InnoDB、Memory、Archive等23。其中,InnoDB是MySQL的默认存储引擎,它提供了强大的事务处理、行级锁定和外键约束功能4。MyISAM则不支持事务、行级锁和外键约束的功能
如使用wp_comments
表格。只需运行ALTER命令即可将其转换为InnoDB存储引擎。注意:我们始终建议在对MySQL数据库运行任何操作之前对其进行备份。
ALTER TABLE wp_comments ENGINE=InnoDB;
比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。
是一种记录数据库中发生的更改的日志文件。 它记录了数据以及数据库结构的更改
它可以
将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件,通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的
$PATH/mysqldumpslow -s c -t 10 /application/mysql/data/slow.log
#输出记录次数最多的10条SQL语句
[!TIP]
/application/mysql/data/slow.log 是慢查询日志路径
#数据库备份
mysqldump -u root -p wordpress > wordpress_database.sql
#数据库还原
mysql > source /backup/mysqldump/wordpress_database.sql
在MySQL服务损坏且没有备份的情况下,数据库服务的恢复是一项具有挑战性的任务。尽管无法完全保证恢复所有丢失的数据,但以下是一些可能的恢复步骤和策略:
/var/lib/mysql
目录下),查看是否有明显的损坏迹象,如文件缺失、损坏或大小异常。/var/lib/mysql
目录下是否存在二进制日志文件(通常以mysql-bin.
开头)。mysqlbinlog
工具分析二进制日志文件,找出在损坏发生前执行的最后一个完整事务。mysql
命令将这些语句应用到新的或修复后的数据库中。 该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。即使事务中的语句都是交叉执行的,在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
它包含两个主数据库(Master),每个主数据库都可以处理读写请求,并且互为主备。
这种情况常发生于从库没有配置super_read_only=1,然后管理员错误地在从库增删了数据,导致从库与主库数据不一致。要解决这类问题,通常需要在从库执行反向操作,比如删掉这些错误新增的数据,通过手动的方式让主从数据恢复到之前一致状态。
mysql > stop slave
执行show slave status命令查看从库状态,获取当前已应用到的binlog信息,主要关注Last_Error中所提示的信息
根据Last_Error中的报错信息获取具体出错的SQL
show binlog events in 'mysql-bin.032102' from 730019106 limit 10; #找到对应行,该行中Info信息就是1973位置所做操作
定位出错误语句后只需要在从库执行反向操作处理这些数据即可,然后重新启动slave进程
mysql > start slave
执行SHOW SLAVE STATUS\G
命令
关注Slave_IO_Running
字段,如果为No
,则表示IO线程未运行。
检查Last_IO_Error
和Last_IO_Errno
字段
根据错误信息和代码,可以初步判断故障原因。
延时从库是指故意配置从库延迟一定时间复制主库的数据。
半同步复制要求主库在事务提交前,至少有一个从库已经接收到并记录了该事务的binlog日志。
过滤复制允许用户灵活指定哪些数据库或表需要被复制,哪些则不需要。
适用于业务隔离、性能优化和数据迁移等场景。
(逐步迁移特定的数据库或表,减少迁移过程中的风险和复杂性。)
搭建三台mysql数据库
修改配置文件/etc/my.cnf
server-id
开启binlog日志
创建主从复制用户
配置主从复制主机信息
重启mysql
开启GTID
正式部署MHA
工具包下载
安装依赖包
命令软连接(所有节点)
部署管理节点(mha-manager:mysql-db03)
编辑配置文件(manage节点)
配置ssh信任(所有节点)
启动测试(manage节点)
启动MHA