Press "Enter" to skip to content

Month: August 2017

MySQL的事务

事务(Transaction)是数据库区别于文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所有修改都不保存。


InnoDB存储引擎中的事务完全符和ACID的特性:
1. A原子性(Atomicity)
原子性指整个数据库事务是不可分割的工作单元。只有使事务中所有的数据库操作都执行成功,才算整个事务的成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。
2. C一致性(Consistency)
一致性指事务将数据库从过一种状态转变为下一种一致性的状态。事务是一致性的单位,如果事务中某个动作失败了,系统可以自动撤销事务——返回初始化的状态。
3. I隔离性(Isolation)
隔离性还有其他称呼,如并发控制、可串行化、锁等。事务的理性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常这是用锁来实现。
4. D持久性(Durability)
事务一旦提交,其结果就是永久性的。及时发生宕机等故障,数据库也能将数据恢复。注意,只能从事务本身的角度来保证结果的永久性。如果因为外部原因,比如raid卡损坏、不可抗力等原因导致数据库损坏,所提交数据仍然有可能丢失。因此,持久性保证事物系统的高可靠性,而不是高可用性。

认识事务

事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都做修改,要么都不做。这就是事务的目的,也是事务模型区别与文件系统的重要特性之一。

分类

  • 扁平事务
    扁平事务中,所有操作都处于同一层次,由begin work开始,由commit work或者rollback work结束,期间的操作是原子的,要么执行,要么回滚。
  • 带有保存点的扁平事务
    除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的一个状态。保存点用来通知系统应该记住事务当前的一个状态。
  • 链事务
    带有保存点的扁平事务,当发生系统崩溃时,所有的保存点都将小时,因为其保存点是易失的,而非持久的。链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。提交事务操作和开始下一个事务操作将合并为一个原子操作。
  • 嵌套事务
    嵌套事务是一个层次结构框架,由一个顶层事务控制各个层次的事务。顶层事务之下嵌套的事务被成为子事务。
  • 分布式事务
    在分布式环境下运行的扁平事务,需要根据数据所在位置访问网络的不同节点。

实现

事务的隔离性由锁来实现。原子性、一致性和持久性通过数据库的redo log和undo log来完成。redo log成为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。
redo和undo的作用都可以视为一种恢复操作,redo恢复提交事务修改的页操作,而undo回滚行记录到某个特定版本。redo通常是物理日志,记录的是页的物理修改操作。undo是逻辑日志,根据每行记录进行记录。

redo

重做日志用来实现事务的持久性。其由两部分组成:一是内存中的重做日志缓冲(redo log buffer),其实易失的;二是重做日志文件(redo log file),其是持久的。
InnoDB是事务的存储引擎,当事务提交时,必须先将该事务的所有日志写入到重做日志文件进行持久化,待事务的commit操作完成才算完成。
为了确保每次日志都写入redo log,在每次将redo log buffer写入redo log之后,InnoDB都需要调用fsync操作。因此,磁盘性能决定了事务提交的性能,也就是数据库的性能。
参数innodb_flush_log_at_trx_commit用来控制重做日志刷新到磁盘的策略。该参数的默认值为1,表示事务提交时必须调用一次fsync操作。开可以设置该参数的值为0和2.0表示事务提交时不进行写入redo log操作,这个操作仅在master thread中完成,而在master thread中每一秒会进行重做日志文件的fsync操作。2表示事务提交时将redo log buffer写入redo log,不进行fsync操作。在这个设置下,当MySQL数据宕机而操作系统未宕机时,并不会丢失事务。

undo

事务的回滚操作需要由undo来实现。与redo不同,undo存放在数据库内部一个特殊的字段中,这个段被成为undo段,它位于共享表空间内。可以通过py_innodb_page_info.py来查看。

事务的隔离级别

SQL标准定义的四个隔离级别由低到高为:
* read uncommitted——浏览访问
* read commited——游标稳定
* repeatable read——隔离,没有幻读的保护,为InnoDB默认级别
* serializable——隔离,串行化

Ubuntu小技巧

系统默认进入字符(console)模式

sudo vi /etc/default/grub

注释掉 GRUB_CMDLINE_LINUX_DEFAULT=”quiet”
把GRUB_CMDLINE_LINUX=”" 改为 GRUB_CMDLINE_LINUX=”text”
去掉 #GRUB_TERMINAL=console 的注释,即 GRUB_TERMINAL=console

sudo update-grub
sudo systemctl set-default multi-user.target
sudo sync

进入命令行模式后,可以如下命令切换回桌面模式

sudo systemctl start lightdm

字符(console)模式下外挂中文平台避免乱码

sudo apt install -y zhcon
echo 'alias zhcon="zhcon --utf8"' |.bashrc
source .bashrc
zhcon

修改字符(console)模式下的字体

redhat系默认使用vga字体,而debian系使用fixed字体。个人更喜欢vga字体。

sudo dpkg-reconfigure console-setup

修改完成之后使用setupcon刷新字体

Ubuntu系统初始化

#!/bin/bash
#安装numix源
add-apt-repository ppa:numix/ppa -y
#安装java jdk
add-apt-repository ppa:webupd8team/java -y
#为知笔记
add-apt-repository ppa:wiznote-team -y
#percona软件
curl https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
#系统更新
apt update
apt dist-upgrade -y

#安装需要功能
apt install -y tasksel vym retext wireshark geany geany-plugins 
apt install -y filezilla unzip unrar p7zip-full
apt install -y fonts-droid-fallback fonts-dejavu* fonts-wqy-* fonts-arphic-uming
apt install -y vsftpd git apache2 php7.0
apt install -y dkms gdebi wiznote
apt install -y oracle-java8-installer oracle-java8-set-default

#美化
apt install -y numix-icon-theme numix-gtk-theme numix-folders numix-icon-theme-circle unity-tweak-tool

#编程所需
apt install -y build-essential gcc g++ automake make autoconf htop vim curl git wget lftp tasksel net-tools ctags
apt install -y python2.7 python2.7-dev python-pip
apt install -y python-easygui python-pygame python-tk python-pyqt5 
apt install -y python-nmap nmap python-numpy mycli
curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc
pip install pip --upgrade

#配置中文化
apt install -y hunspell-en-za hunspell-en-ca hunspell-en-au
apt install -y language-pack-zh-hans libreoffice-help-zh-cn mythes-en-au fcitx-frontend-qt4 libreoffice-l10n-en-gb libreoffice-l10n-zh-cn  libreoffice-help-en-gb thunderbird-locale-en-gb thunderbird-locale-zh-hans libreoffice-l10n-en-za firefox-locale-zh-hans language-pack-gnome-zh-hans thunderbird-locale-zh-cn
apt install -y fcitx-ui-qimpanel fcitx-sunpinyin  fcitx-table-wubi   fcitx-frontend-qt5  hyphen-en-gb fcitx-ui-classic hunspell-en-gb fcitx-module-cloudpinyin fonts-arphic-ukai fcitx fcitx-frontend-gtk3 fcitx-frontend-gtk2  fcitx-pinyin fcitx-libs

#安装服务功能
tasksel install openssh-server
tasksel install basic-ubuntu-server

#安装数据库
MYSQL_PASSWORD=123456
echo "mysql-server-5.7 mysql-server/root_password password ${MYSQL_PASSWORD}
mysql-server-5.7 mysql-server/root_password seen true
mysql-server-5.7 mysql-server/root_password_again password ${MYSQL_PASSWORD}
mysql-server-5.7 mysql-server/root_password_again seen true
" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive apt install -y --force-yes mysql-server

#配置httpd功能
tasksel install lamp-server
a2enmod deflate rewrite headers expires
apt install -y libapache2-mod-wsgi
service apache2 restart
#apt install -y phpmyadmin

#设置wireshark普通用户启动
chgrp wireshark /usr/bin/dumpcap
chmod 4755 /usr/bin/dumpcap
gpasswd -a $(whomai) wireshark

#虚拟化配置
tasksel install virt-host
apt -y install qemu-kvm libvirt-bin virtinst bridge-utils 
apt -y install libosinfo-bin libguestfs-tools virt-top 
modprobe vhost_net 
apt -y install virt-manager iotop 

#升级系统配置

ldconfig
updatedb
sync

#防火墙配置
ufw enable
service ufw start
ufw allow ssh
ufw allow http
ufw allow https
ufw allow ftp
ufw allow ftps
ufw reload
ufw status
sync
reboot

MySQL日志

MySQL日志是记录MySQL数据库的日常做早和错误信息的文件。MySQL中,日志可以分为二进制日志、错误日志和通用查询日志以及慢查询日志。

日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化。当数据库遭到意外的损害时,可以通过日志文件来查询出错原因,并且可以通过日志文件进行数据恢复。

服务器日志

记录进程启动运行过程中的特殊时间,帮助分析MySQL服务遇到的问题
根据需求抓取特定的SQL语句,追踪性能可能存在的问题的业务SQL
1. 服务错误日志
记录实例启动运行过程中的重要消息
配置参数
如果MySQL无法启动,应当首先查询
2. 慢查询日志
记录执行时间超过一定阈值的SQL语句
3. 综合查询日志
用于分析系统可能存在的性能问题的SQL语句

事务日志

记录应用程序对数据的所有更改;
可用于数据恢复;
可用于实例间数据恢复
1. 存储引擎事务日志;
部分引擎拥有重做日志(redo log)
InnoDB有WAL(Write Ahead Log)机制存储引擎;
日志随着事务commit有限持久化,却表异常恢复不丢数据;
日志顺序写性能较好
2. 二进制日志

二进制日志

二进制日志也叫做变更日志(update log),主要用于记录数据库的变化情况。

启动和设置二进制日志

[ubuntu]
sujx@TC8304:~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
\\查找定位log_bin,取消字段前面的#号
server-id       = 1
log_bin         = /var/log/mysql/mysql-bin.log 
sujx@TC8304:~$ sudo service mysql restart
sujx@TC8304:/var/log/mysql$ ls
error.log    mysql-bin.000002  mysql-bin.index  mysql-bin.000001

查看二进制日志

sujx@TC8304:/var/log/mysql$ sudo mysqlbinlog mysql-bin.000001

删除二进制日志

mysql> reset master;