MySQL

关系型数据库管理系统
一个表中可以没有行 但是不能没有列,表是由行和列组成的二维关系

第一范式:数据库表的每一列都是不可分割的原子数据项,简而言之,第一范式就是无重复的域
第二范式:需满足第一范式,要求数据库表中的每个实例或记录必须可以被唯一的区分,选取一个能区分每个实体的属性或属性组 ,作为实体的唯一标识
第三范式:

一个数据集 为满足范式需要 被拆分成N张表

事务ACID特性

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。

  数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

  原子性:指整个数据库事务是不可分割的工作单位。只有使据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。

  一致性:指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。

  隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

  持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

  事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。

  数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

#创建mysql用户和组
    groupadd mysql     //创建mysql组
    useradd -g mysql mysql //创建mysql用户添加到mysql组
CentOS 6
[root@node1 ~]# groupadd -r mysql
[root@bogon ~]# useradd -g mysql mysql
[root@node1 ~]# tar xf mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local
[root@node1 ~]# cd /usr/local
[root@node1 ~]# ln -sv mariadb-10.0.10-linux-x86_64/ mysql
[root@node1 ~]# cd mysql/
[root@node1 ~]# chown -R root:mysql ./*

[root@node1 ~]# fdisk /dev/sda
[root@node1 ~]# partx -a /dev/sda
[root@node1 ~]# pvcreate /dev/sda6
[root@node1 ~]# vgcreate myvg /dev/sda6
[root@node1 ~]# vgs
[root@node1 ~]# lvcreate -L 10G -n mydata myvg
[root@node1 ~]# yum install -y xfsprogs
[root@node1 ~]# modprobe xfs
[root@node1 ~]# mkfs.xfs /dev/myvg/mydata
[root@node1 ~]# mkdir /mydata
[root@node1 ~]# vim /etc/fstab
            /dev/myvg/mydata        /mydata                 xfs     defaults        0 0
[root@node1 ~]# mount -a
[root@node1 ~]# mount
[root@node1 ~]# cd /mydata
[root@node1 mydata]# mkdir data
[root@node1 mydata]# chown mysql.mysql data
[root@node1 mydata]# cd /usr/local/mysql
[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/
[root@node1 mysql]# ls
[root@node1 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@node1 mysql]# chkconfig --add mysqld
[root@node1 mysql]# chkconfig --list mysqld
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@node1 mysql]# mkdir /etc/mysql
[root@node1 mysql]# cp support-files/my-large.cnf  /etc/mysql/my.cnf
[root@bogon mysql]# vim /etc/mysql/my.cnf
#添加下列三行
                     42 datadir = /mydata/data
                     43 innodb_file_per_table = on
                     44 skip_name_resolve = on  #跳过名称反解
[root@node1 mysql]# service mysqld start
[root@node1 mysql]# ln -s /usr/local/mysql/bin/mysql /usr/bin

Mysql安全初始化

[root@node1 ~]# mysql
Welcome to the MariaDB monitor.  

MariaDB [(none)]> use mysql
Database changed
MariaDB [mysql]> SELECT User,Host,Password FROM user;

MariaDB [mysql]> exit
Bye

#安全初始化
[root@node1 ~]# /usr/local/mysql/bin/mysql_secure_installation

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Set root password? [Y/n] Y  
New password: 
Re-enter new password: 
 ... Success!

Remove anonymous users? [Y/n] Y
 ... Success!

Disallow root login remotely? [Y/n] n  
 ... skipping.

Remove test database and access to it? [Y/n] n
 ... skipping.

Reload privilege tables now? [Y/n] Y
 ... Success!

All done!  

Thanks for using MariaDB!
[root@node1 ~]# 

[root@localhost ~]# vi ~/.bash_history

编译安装

#添加mysql用户及用户组
[root@localhost ~]# groupadd -r -g 306 mysql
[root@localhost ~]# useradd -r -g 306 -u 306 mysql
#创建逻辑卷
[root@localhost ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p

Disk /dev/sda: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors/track, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c108b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         511     4096000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             511        6885    51200000   83  Linux
/dev/sda3            6885       13259    51200000   83  Linux
/dev/sda4           13259       26109   103218176    5  Extended
/dev/sda5           13259       13769     4096000   82  Linux swap / Solaris

Command (m for help): n
First cylinder (13769-26109, default 13769): 
Using default value 13769
Last cylinder, +cylinders or +size{K,M,G} (13769-26109, default 26109): +20G

Command (m for help): t
Partition number (1-6): 6
Hex code (type L to list codes): 8e
Changed system type of partition 6 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
[root@localhost ~]# partx -a /dev/sda
[root@localhost ~]# pvcreate /dev/sda6
  Physical volume "/dev/sda6" successfully created
[root@localhost ~]# vgcreate myvg /dev/sda6
  Volume group "myvg" successfully created
[root@localhost ~]# lvcreate -L 10G -n mydata myvg
[root@localhost ~]# lvs 
[root@localhost ~]# mke2fs -t ext4 /dev/myvg/mydata
[root@localhost ~]# mkdir -pv /mydata
[root@localhost ~]# vim /etc/fstab
 17 /dev/myvg/mydata        /mydata                 ext4    defaults        0 0
[root@localhost ~]# mount
[root@localhost ~]# mount -a
[root@localhost ~]# mount
 [root@localhost ~]# mkdir /mydata/data
mkdir: cannot create directory `/mydata/data': File exists
[root@localhost ~]# chown mysql.mysql /mydata/data 
安装
[root@localhost ~]# yum groupinstall "Development Tools" "Server Platform Development" –y
[root@localhost ~]# yum install cmake -y
[root@localhost ~]# ls
[root@localhost ~]# tar xf mariadb-5.5.46.tar.gz 
[root@localhost ~]# cd  mariadb-5.5.46.tar.gz 
[root@localhost ~]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb-5.5.46 -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@localhost ~]# make
[root@localhost ~]# make install
[root@localhost ~]# cd /usr/local/mariadb-5.5.46/
[root@localhost mariadb-5.5.46]# ls
[root@localhost mariadb-5.5.46]# chown -R root.mysql ./*
[root@localhost mariadb-5.5.46]# cd ..
[root@localhost local]# ln -sv mariadb-5.5.46/ mysql
[root@localhost local]# cd mysql/
[root@localhost mysql]# ls
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[root@localhost mysql]# ls /mydata/data
[root@localhost mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
[root@localhost mysql]# vim /etc/mysql/my.cnf
42 datadir = /mydata/data
43 innodb_file_per_table = ON
44 skip_name_resolve = ON
[root@localhost mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@localhost mysql]# chkconfig --add mysqld
[root@localhost mysql]# service mysqld start
#启动
[root@localhost mysql]# /usr/local/mysql/bin/mysql
查看链接线程
MariaDB [hellodb]> SHOW PROCESSLIST;
隔离级别:
未提交读(READ-UNCOMMITTED)  问题:脏读 不可重复读 幻读
提交读(READ-COMMITTED) 问题:不可重复读 幻读
可重读(REPEATABLE-READ)    问题:幻读
可串行化(SERIALIZABLE)  问题:加锁读

脏读:能读到别人尚未提交的数据
不可重复读:两次读到的数据不一致
幻读:可重复读,会产生幻读
加锁读

#查看定义隔离级别   默认为REPEATABLE-READ
MariaDB [hellodb]> SHOW VARIABLES LIKE 'tx_isolation';
修改
MariaDB [hellodb]> SET tx_isolation=’READ_UNCOMMITTED’;

死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态
事务回滚

MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> DELETE FROM students WHERE StuID=25;
MariaDB [hellodb]> ROLLBACK;

保存点

MariaDB [hellodb]> START TRANSACTION;
MariaDB [hellodb]> DELETE FROM students WHERE StuID=4;
MariaDB [hellodb]> SAVEPOINT sp1;
MariaDB [hellodb]> ROLLBACK TO sp1;
MariaDB [hellodb]> ROLLBACK;

MariaDB [hellodb]> LOCK TABLES  students READ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> LOCK TABLES students WRITE;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

#查看MariaDB 版本号
MariaDB [(none)]> SELECT VERSION();
#查看字符集
MariaDB [(none)]> SHOW CHARACTER SET;
#查看排序规则
MariaDB [(none)]> SHOW COLLATION;
#查看存储引擎
MariaDB [(none)]> SHOW ENGINES;
#创建数据库
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;e
MariaDB [testdb]> CREATE SCHEMA IF NOT EXISTS testdb;
#删除数据库
MariaDB [testdb]> DROP DATABASE IF EXISTS testdb; 
MariaDB [testdb]> DROP SCHEMA  IF EXISTS testdb;
#定义默认库
MariaDB [testdb]> USE testdb;
#查看数据表
MariaDB [testdb]> SHOW TABLES;
#查看表结构
MariaDB [hellodb]> DESC students;
#创建数据表
MariaDB [testdb]> CREATE TABLE tb1 (id int NOT NULL,name VARCHAR(30) NOT NULL,age tinyint);

#表中插入数据
MariaDB [hellodb]> INSERT INTO students SET Name='yinjiao',Age='99',Gender='M';
MariaDB [hellodb]> INSERT INTO students (Name,Age,Gender) VALUES ('jinjiao','100','M');
MariaDB [hellodb]> INSERT INTO students VALUES('tom',24,7890.23);

#查询表中数据
MariaDB [hellodb]> SELECT * FROM classes;
MariaDB [hellodb]> SELECT biao1.id,biao1.age,biao2.id,biao2.pname FROM biao1,biao2
MariaDB [hellodb]> SELECT id,name FROM biao;
MariaDB [hellodb]> SELECT * FROM classes WHERE ClassID=4
MariaDB [hellodb]> SHOW TABLE STATUS LIKE 'students';

#WHERE比较运算符
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age > 50;
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age+30<50;
#WHERE不等于
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age != 22;
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age <> 22;
#查找列表内数据
MariaDB [hellodb]> SELECT Name,Age FROM students WHERE Age IN (18,100);
#查找某一字段为空
MariaDB [hellodb]> SELECT Name,Age,ClassID FROM students WHERE ClassID IS NULL;

修改
mysql> UPDATE xinbiao SET age = age+5;
mysql> UPDATE xinbiao SET age = age + id;
mysql> UPDATE xinbiao SET age = age + id, sex = 0;
mysql> UPDATE xinbiao SET age = age - 10  WHERE age % 2 = 0;


删除
mysql> DELETE FROM xinbiao id = 5;
mysql> DELETE FROM xinbiao WHERE id< 5;

#排序
MariaDB [hellodb]> SELECT Age AS sAge,StuID AS sid FROM students ORDER BY Age DESC;
#LIMIT 对查询语句作数量限制
MariaDB [hellodb]> SELECT StuID AS sid,Age AS sage FROM students ORDER BY sage DESC LIMIT 10;
#LIMIT 对查询语句作数量限制
MariaDB [hellodb]> SELECT StuID,Age FROM students ORDER BY Age DESC LIMIT 5,3;

#创建索引
MariaDB [hellodb]> ALTER TABLE students ADD INDEX(Age);
MariaDB [hellodb]> CREATE INDEX name ON students (Name);
#查看索引
MariaDB [hellodb]> SHOW INDEXES FROM students;
#查看mysql如何使用索引来处理select语句以及连接表
MariaDB [hellodb]> EXPLAIN SELECT * FROM classes WHERE ClassID=4\G;
#查询缓存命中次数
MariaDB [hellodb]> SHOW GLOBAL STATUS LIKE 'Qcache_hits';
#查询总次数
MariaDB [hellodb]> SHOW GLOBAL STATUS LIKE 'Com_select';
#字段别名
mysql> SELECT id AS uid,age AS uage FROM biao;
#算数
MariaDB [(none)]> SELECT 1+1;
#数据去重
MariaDB [hellodb]> SELECT DISTINCT Gender FROM students;
#等值连接
MariaDB [hellodb]> SELECT * FROM students,teachers WHERE students.TeacherID=teachers.TID;
MariaDB [hellodb]> UPDATE students SET TeacherID=2 WHERE StuID=27;
MariaDB [hellodb]> SELECT s.Name,t.Name FROM students AS s,teachers AS t WHERE s.TeacherID=t.TID;

MariaDB [hellodb]> SELECT s.Name,c.class FROM students AS s,classes AS c WHERE s.ClassID=c.ClassID;
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'query_cache_min_res_unit';


#UNION
MariaDB [hellodb]> SELECT Name FROM students UNION SELECT Name FROM teachers;

#忘记密码
[root@bogon ~]# vim /etc/rc.d/init.d/mysqld
                添加该选项 298  --skip-grant-tables --skip-networking
[root@bogon ~]# service mysqld stop
[root@bogon ~]# service mysqld start
#修改密码
MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('456456') WHERE user='root';

[root@bogon ~]# vim /etc/rc.d/init.d/mysqld
                删除该选项 298  --skip-grant-tables --skip-networking
[root@bogon ~]# service mysqld stop
[root@bogon ~]# service mysqld start


[root@bogon ~]# mysqladmin -u root -p ping
[root@bogon ~]# mysqladmin -u root -p create tdb






查看MYSQL默认使用配置
[root@bogon ~]# vim /etc/profile.d/mysql.sh
                export PATH=/usr/local/mysql/bin:$PATH
[root@bogon ~]# . /etc/profile.d/mysql.sh
[root@bogon ~]# mysql --print-defaults
[root@bogon ~]# mysqld --print-defaults
基于sock通信 类似于共享内存  不用经过TCP/IP协议栈 封包和解包的速度更快 
thread_coucurrency 并行线程数 = CPU核心数*2
查询日志  记录查询操作
    general_log=ON|OFF
    general_log_file=HOSTNAME.log
    log_output=TABLE|FILE|NONE

慢查询日志  执行时长超出指定时长的查询操作
    MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
    MariaDB [hellodb]> SELECT @@GLOBAL.long_query_time;
    SET GLOBAL long_query_time
    slow_query_log=ON|OFF 是否启用慢查询日志
    log_slow_queries = ON|OFF
    slow_query_log_file=HOSTNAME-slow.log慢查询日志文件
    log_slow_rate_limit=1 记录速率
    log_slow_verbosity 详细级别 

错误日志
    (1) mysqld启动和关闭过程 输出的信息; 
    (2) mysqld运行中产生的错误信息; 
    (3) event scheduler运行时产生的信息;
    (4) 主从复制架构中,从服务器复制线程启动时产生的日志;

log_error=/PATH
log_warnings={ON|OFF}    是否记录警告日志到错误文件中

二进制日志记录的是导致数据发生改变或潜在导致数据发生改变的SQL语句
    #查看二进制日志文件列表
    MariaDB [hellodb]> SHOW MASTER LOGS;
    MariaDB [hellodb]> SHOW BINARY LOGS;
    #查看正在使用中的二进制日志文件
    MariaDB [hellodb]> SHOW MASTER STATUS;
    MariaDB [hellodb]> SHOW BINLOG EVENTS IN 'mysql-bin.000002';
    sql_log_bin=ON|OFF表示是否记录二进制日志
    binlog_format=STATEMENT|ROW|MIXED二进制日志记录的格式
    max_binlog_size单个二进制日志文件的最大体积   到达最大值会自动滚动 默认为1G
    sync_binlog=1|0是否启用二进制日志同步功能   当事务提交时是否立即将binlog缓冲区中记录下的事件写入到磁盘的二进制日志文件中;1 影响性能 0 影响数据;
mysqlbinlog:客户端命令工具
选项:--start-datetime=  YYYY-MM-DD hh:mm:ss    --stop-datetime= YYYY-MM-DD hh:mm:ss
 --start-position=#    --stop-position=#
查看二进制日志文件内容
[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog /mydata/data/mysql-bin.000002

二进制日志事件格式:
    # at 553
    #160831  9:56:08 server id 1  end_log_pos 624   Query   thread_id=2     exec_time=0     error_code=0
    SET TIMESTAMP=1472608568/*!*/;
    BEGIN
    /*!*/;

    事件发生的日期时间:#160831  9:56:08
    事件发生的服务器id:server id 1
    事件的结束位置:end_log_pos 624
    事件的类型:Query
    事件发生时所在服务器执行此事件的线程的ID: thread_id=2 
    语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0
    错误代码:error_code=0
    事件内容:SET TIMESTAMP=1472608568/*!*/;



事务日志:把数据日志中的数据同步到数据文件中   用于崩溃后数据恢复操作。每一次事务提交时,先写事务日志
中继日志:复制架构中,从服务器用于保存主服务器的二进制日志中读取到的事件

mysqldump

[root@localhost ~]# mysqldump -uroot --databases hellodb > /test/beifen.sql
[root@localhost ~]# mysqldump -uroot --all-databases --lock-all-tables --master-data=2  > /test/all.sql

二进制日志还原
[root@localhost lib]# mysqlbinlog --start-position=245 /var/lib/mysql/mysql-bin.000001 > incre.sql

xtrabackup

[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum –y install percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm 
完全备份
[root@localhost ~]# innobackupex --user=root /test/
增量备份
[root@localhost ~]# innobackupex --incremental /test/ --incremental-basedir=/test/1970-01-01_01-01-01
整理完全备份
[root@localhost ~]# innobackupex --apply-log /test/1970-01-01_01-01-01/
合并增量备份
[root@localhost ~]# innobackupex --apply-log --redo-only /test/1970-01-01_01-01-01/ --incremental-dir=/test/1970-01-01_01-01-01/
[root@localhost ~]#systemctl stop mariadb.service
还原
[root@localhost ~]# innobackupex --copy-back /test/1970-01-01_01-01-01/

[root@localhost ~]# cd /mydata/data

[root@localhost data]# chown –R mysql.mysql ./*

[root@localhost ~]#systemctl start mariadb.service

主从复制

    从节点:
        I/O Thread:从Master请求二进制日志事件,并保存于中继日志中;
        SQL Thread:从中继日志中读取日志事件,在本地完成重放;

    主节点:
        dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值