目录

hymn

忽有故人心头过,回首山河已是秋。

标签: Mysql (16)

重新理解MySQL的事务、redo log、undo log,bin log、MVCC、间隙锁、快照读、当前读 有更新!

MySQL 事务,四个特性 原子性 一致性 持久性:通过redolog实现,事务的修改会先放到buffer pool(内存),redolog(磁盘,顺序写)中,提交事务后会慢慢刷到磁盘,当服务器在刷到磁盘钱宕机了,重启后会通过redolog重新写。 隔离性: 读未提交:脏读,不可重复度,幻读 读提交:不可重复度,幻读 可重复度: 串行话: 脏读:读取到事务没有提交的数据 不可重复度:事务中几次读取到数据不一致,数据被修改 幻读:事务中几次读取到数据不一致,数据增加或者删除 读提交解决了脏读,在事务修改时加排他锁,读事务无法读取到为提交的数据 可重复读解决了,脏读,不可重复读,幻读,通过MVCC和间隙锁 RR隔离级别下: MySQL的innodb在数据的后面增加了两列隐藏列,一个是DB_TRX_ID,一个是DB_ROLL_PTR DB_TRX_ID:事务插入时的事务id DB_ROLL_PTR:事务删除数据行时,会把当前的事务id放到这里 可重复读:事务读取时, DB_TRX_ID: 会读取数据中事务id小于等于当前事务id的数据,因为小于等于当前事务id的数据行,代表数据行时在事....

MySQL 排序 FIELD

需求:按照指定字符串排序, 分析:运用 FIRLD 可以实现 问题:字段中有null 值,需要放到最后 // 在排序前加 rating is null 并且 在 FLELD 中加 IFNULL(rating,"") SELECT * FROM `dl_school` ORDER BY rating is null,FIELD(rating,"A+","A","A-",IFNULL(rating,"")),sort DESC

MySQL 编码问题

问题:在本地创建MySQL查不到数据,在navicat是查得到数据的 环境:win10 分析:在Linux正式服务器中的MySQL是正常的,但是win10找不到,可能是编码不一致造成的。 解决:在my.ini设置数据库编码,在my.ini中添加或修改如下配置,然后重启MySQL [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] character_set_server=utf8

MySQL rr和rc,隔离性和一致性

隔离性: 一个事务可以读到另外一个事务提交的数据,可能在这个事务中两次读到的数据不一样;rc 一致性: 一致性指事务将数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据 库的完整性约束没有被破坏。 例如,在表中有一个字段为姓名,为唯一约束,即在表中姓名不能重复。如果一个事务对姓名字段进行了修改,但是在事务提交或事务操作发生回滚后,表中的姓名变得非唯一了, 这就破坏了事务的一致性要求,即事务将数据库从一种状态变为了一种不一致的状态。因此,事务是一致性的单位,如果事务中某个动作失败了,系统可以自动撤销事务——返回初始化的状态 RC:解决脏读(读取到事务未提交的数据),但是不可重复读,不过可以容忍,因为读到的都是事务提交后的数据; RR: 解决脏读,可重复读,MVCC + GAP间隙锁; MVCC: mysql 都RR是快照读,但是rc和rr的快照读不一样 rc:只锁行,读取最新的快照(A事务读取数据,未提交,读到数据a = 1,B事务修改数据set a = 2,提交,A事务读取到a = 2;A事务两次读取的数据不一样,破坏了隔离性。) rr:锁间隙和行,读取时间最早....

Linux MySQL 启动失败

cat /etc/my.cnf datadir=/usr/local/mysql/data basedir=/usr/local/mysql socket=/tmp/mysql.sock user=mysql port=3306 character-set-server=utf8 #取消密码验证 skip-grant-tables #Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 #skip-grant-tables [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid #修改datadir basedir log-error 等目录的权限,都改为mysql chown mysql.mysql /var/log/mysqld.log

MySQL 改密码

MySQL5.7 update user set authentication_string=passworD("123456") where user='root'; 修改密码后 root使用123456从任何主机连接到mysql服务器。 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

mysql redo undo binlog 日志理解

redo log和undo log undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: 1.redo log通常是物理日志,记录的是数据页的物理修改, 而不是某一行或某几行修改成怎样怎样,它用来恢复提交 后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。 2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。 binlog binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的 redo/undo log是完全不同的日志;其主要是用来记录对mysql数据 更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中; 作用主要有: 复制:MySQL Replication在Master端开启binlog,Master把它的 二进制日志传递给slaves并回放来达到master-slave数据一致的目的 数据恢复:通过mysqlbinlog工具恢复数据 增量备份

Linux 下查看 MySQL得配置文件

which mysqld /usr/sbin/mysqld --verbose --help | grep -A 1 'Default options' #文件路径:MySQL会依次读取 路径下得my.cnf

MySQL 更新密码

5.7之前 mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='username'; 5.7 mysql> UPDATE user SET authentication_string=PASSWORD("new_password") WHERE user='root'; //刷新系统权限表 mysql> FLUSH PRIVILEGES;

MySQL中int(M)和tinyint(M)

整数型的数值类型已经限制了取值范围,有符号整型和无符号整型都有,而M值并不代表可以存储的数值字符长度,它代表的是数据在显示时显示的最小长度; 当存储的字符长度超过M值时,没有任何的影响,只要不超过数值类型限制的范围; 当存储的字符长度小于M值时,只有在设置了zerofill用0来填充,才能够看到效果,换句话就是说,没有zerofill,M值就是无用的。 总结:int(11),tinyint(1),bigint(20),后面的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill。 所以我们在设计mysql数据库时,建表时,mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。 所以,就用这些默认的显示长度就可以了。不用再去自己填长度,比如搞个int(10)、tinyint(1)之类的,基本没用。而且导致表的字段类型多样化。 int(M) M只有在设置zerofill时才有用处,标识的意思的显示最小长度,前面会用0填充, 比如(在设置了zerofill时): ....