8 Linux MYSQL 关系型数据库 v5.5 ★★★
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库
数据库的分类:
关系型数据库与非关系型数据库NOSQL
8.1 Mysql 概述:
8.1.1 Mysql版本:
Mysql 5.1
Mysql 5.5
Mysql 5.6
mysql 5.7
8.1.2 常用数据库软件
? Oracle 世界三大
? Sybase
? Infomix
? SQL Server sybase和micrsoft共同开发
? MySQL
? PostgreSQL
? pgsql
? EnterpriseDB redhat注资
? MariaDB
? Memcachedb 存内存
? redis 支持内存缓存
? MongoDB
是一个介于关系型数据库和非关系型数据库之间的产品
MySQL,SQL 瑞典 MySQL AB 作者女儿名字命名
8.1.3 MYSQL事务工作原理:
可以能保证你做的一系列动作,要么全部成功。如果有一个操作失败,就回退到修改前。
比如你要做下面几个操作:
1.删除表A中的某些记录;
2.向B添加一些记录;
3.修改C表中的一些数据;
使用事务,如果1,2都成功了,3却失败了。
就会回退到第1步执行前的样子,ABC表都没被修改。
8.1.4 什么是关系型数据库
关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了数据库。表与表之间的数据记录有关系。用户用查询(Query)来检索数据库中的数据。一个Query是一个用于指定数据库中行和列的SELECT语句。关系型数据库通常包含下列组件:
关系型数据库使用结构化查询语句select语言
常见的olace mysql
特点:
优点:读写更多的是和磁盘交互,数据一致性好,安全
缺点:速度慢
8.1.5 什么是非关系统数据库?
非关系型数据库也被称为NoSQL数据库,NoSQL的本意是Not only sql,指的是非关系型数据库,
非关系型数据库是关系统数据库的一个补充
动态请求越来越多,对数据库的要求越来越高,而传统的数据库它遵守的ACID的要求,(原子性、一致性、隔离性、持久性四大特性)保证数据安全和完整性,导致数据存储速度很慢,所以NOSQL数据库就出现了
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性 (Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程 (Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
典型代表:Fackebook Cassandra HBase在使用
Redis mond
非关系型数据库程类:
- 键值key-value存储数据库
典型的,Memcached redis memcacheDB - 列存储(column-oriented)数据库
黄型的:Cassandra HBase - 面向文档(Document-Oriented)数据库
黄型的:MongoDB CouchDB - 面向图形的数据库
8.1.6 mysql的特点:
- mysql性能卓越,服务稳定,很少出现异常宕机
- mysql开放源码且无版本制约,自主性及使用成本低
- mysql历史悠久,社区及用户非常活跃
- mysql软件体积小,安装简单易维护
- mysql品牌口碑效应
- mysql支持多种操作系统,提供多种API接口
8.1.7 数据类型
数值类型
整数类型 字节 范围(有符号) 范围(无符号) 用途
数据类型 描述
INT(size) -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
字符串类型
数据类型 描述
CHAR(size)
定长字符 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。英文占用1个字符 汉字占用2个字符
注解:【定长】含义是指定的长度是多少,系统就占用多少长度,就算你内容比长度短,也照样占用那么多。超出了长度就会溢出,存在浪费空间
VARCHAR(size)
变长字符 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。
注释:如果值的长度大于 255,则被转换为 TEXT 类型。
注解:【变长】含义是指指定的长度是多少,系统不会占用相同长度,而是根据内容的长度来占用,比如指定20,只输入5个字符,则只占用5个字符,反之超出就会溢出。
TEXT 存放最大长度为 65,535 个字符的字符串。
Nchar() 保存固定长度的字符串(简体,繁体)。在括号中指定字符串的长度。最多 255 个字符。
Nvarchar()
日期和时间类型
类型 大小(字节) 范围 格式 用途
DATE 4 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
8.1.8 mysql发布版本
Alpha版:开发测试版
Beta版:测试完成后的版本
RC版:根据Beta版的bug修复后的版本
GA版:对外发布的正式版本
8.1.9 mysql版本选择
- 稳定版:选择开源的社区版的稳定版GA版本
- 产品线:可以选择5.1或5.5 互联网公司主流5.5 其次5.1和5.6
- 选择Mysql数据库GA版发布后6个月以上的GA版本
- 要选择前后几个月没有大BUG修复的版本,而不是大量修复BUG的集中版本
- 最好向后较长时间没有更新发布的版本
- 要考虑开发人员开发程序使用的版本是否兼容你选的版本
- 作为内部开发测试数据库环境,跑大概3-6个月的时间
- 优先企业非核心业务采用新版本的数据库GA版本
8.1.10 Mysql 数据库引擎 MyISAM和InnoDB
8.1.10.1 mysql引擎分类
MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务,支持表锁不支持行锁;
InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎;
BDB 源自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性;
Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失;
mysql> SHOW ENGINES;
+------------+---------+----------------------------------------------------
| Engine | Support | Comment
+------------+---------+--------------------------------------------------
| ndbcluster | NO | Clustered, fault-tolerant tables
| MRG_MYISAM | YES | Collection of identical MyISAM tables
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears)
| CSV | YES | CSV storage engine
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables
| FEDERATED | NO | Federated MySQL storage engine
| ARCHIVE | YES | Archive storage engine
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance
+------------+---------+--------------------------------------------------
8.1.10.2 MyISAM和innoDB
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?
MYSQL5.5.5以前的版本默认MyISAM,5.5以后的默认为InnoDB
MyISAM 类型的表强调的是性能,其执行数度比InnoDB类型更快,但不提供事务支持,如果是单独大量的读或写,MyISAM是更好的选择,支持表锁。但不支持行锁
InnoDB 提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
表锁和行锁:表锁,指当你插入数据时,其它命令不能插入和操作
行锁,如果要插入一行数据时,会锁定当前行,其它行不影响
? MyISAM引擎特点
- 不支持事务
- 表级锁定
- 读写互相阻塞:
- 只会缓存索引、不会缓存数据
- 读取速度较快,占用资源相对少
- 不支持外键约束,但支持全文索引
适应场景:
- 不需要事务支持的业务(例如银行,充值就不行)
- 一盘为读数据比较多的应用,读写都频繁场景不适合,只适合读或写单个多
- 读写并发访问相对较低的业务,纯读纯写都可以 (例如新闻,小说)
- 数据修改相对较少的业务(阻塞问题)
- 以读为主的业务,例如blog 图片信息数据库
- 对数据一致性要求不是非常高的业务
- 硬盘资源比较差的机器
myisam引警优化
- 设置合适的索引(缓存机制)重复值少的列创建
- 调整读写优先级,根据实际需求确保重要操作更优先执行
- 启用廷迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)
- 尽量顺序操作让insert数据都写入到尾部,减少阻塞
- 分解大的操作,降低单个操作的阻塞时间
- 降低并发数,减少对mysql访问,某些高并发场景通地应用进行排队队列机制
? InnoDB引擎特点
- 支持事务: 支持4个事务隔离级别,支持多版本读
- 行级锁定 更新时一般是锁定当前行,通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响
- 读写阻塞与事务隔离级别相关
- 具有非常高效的缓存特性,能缓存索引,也能缓存数据
- 整个表和主键以cluster方式存储,组成一颗平衡树
- 所有Secondary index都会保存主键信息
- 支持分区,表空间
- 支持外键约束,不支持全文索引5.5以前,以后支持
- 对硬件资源要求比较高
生产场景:
- 需要事件支持的业务
- 行级锁对高并发有很好的适应能力,但需要确保查询是通过索引完成的
- 数据读写较为频繁的场景,如,BBS 微博
- 数据一致性要求高的业务,
- 硬件设备内存较大,提高利用率
8.1.10.3 epoll与select 的区别
8.1.10.4 查看表使用的引擎:show create table test_t0;
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT(查询)操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
8.1.10.5 修改MySQL引擎的方法
? 方法1: mysql命令语句修改
创建后引擎的更改
alter table user engine=INNODB;
? 方法2:使用sed对备份内容进行引擎转换
- mysqldump -uroot -p discuz > /backup/discuz.sql
- sed -e ‘s/MyISAM/InnoDB/g‘ discuz.sql > discuz2.sql
- mysql -uroot -p discuz<discuz2.sql
? 方法3: mysql_convert_table_fromat命令修改
mysql_convert_table_fromat -user=root --password=12346 --engine=MyISAM discuz user
? 方法4:批量修改所有表的引擎
通过mysql -e 显示所有表,然后提取表名,能过for循环将所有表的引擎修改
#!/bin/bash
TABLES=$(mysql -e "use bbs;show tables;;"| awk ‘{print $0}‘)
for table in $TABLES
do
mysql -e "use bbs;alter table $table ENGINE=InnoDB;"
done
? 方法5:修改默认引擎
设置InnoDB为默认引擎:在配置文件my.cnf中的 [mysqld] 下面加入
default-storage-engine=INNODB
如果添加innodb引擎报错,需要执行如下命令:
删除/mysql/data目录下的ib_logfile0,ib_logfile1文件即可。
8.2 Mysql 安装
-DCMAKE_INSTALL_PREFIX=dir_name 安装的主目录
-DDEFAULT_CHARSET 字符集,默认字符集是latin1
-DDEFAULT_COLLATION=collation_name 服务校对,默认的是latin1_swedish_ci,可以通过SHOW COLLATION语句查看哪个校对匹配的字符集
-DENABLED_LOCAL_INFILE 是否打开LOAD DATA INFILE的LOCAL参数
-DWITH_INNOBASE_STORAGE_ENGINE=1 将INNODB存储引擎编译进去
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 将FEDERATED存储引擎编译进去
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 将BLACKHOLE存储引擎编译进去
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 不编译EXAMPLE存储引擎
-DWITH_PARTITION_STORAGE_ENGINE=1 将分区存储引擎编译进去
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 将Performance Schema(性能视图)存储引擎编译进去
-DCOMPILATION_COMMENT=string 编译环境描述
-DWITH_READLINE=bool 是否使用readline库
-DSYSCONFDIR=dir_name my.cnf参数文件的路径
-DMYSQL_UNIX_ADDR=file_name Unix socket文件的路径,socket文件用于服务器监听连接,这个参数必须是绝对路径
-DENABLED_PROFILING=bool 是否开启profiling代码的查询(用于SHOW PROFILE and SHOW PROFILES语句)
-DMYSQL_DATADIR=dir_name MySQL文件目录的路径,这个参数也可以在启动MySQL的时候带上--datadir参数进行设置
-DWITH_EXTRA_CHARSETS=name 指定额外的字符集,默认是all,包含所有的字符集。
-DINSTALL_BINDIR=dir_name 安装用户程序的路径,默认路径是DCMAKE_INSTALL_PREFIX/bin
-DINSTALL_DOCDIR=dir_name 安装文档的路径,默认路径是DCMAKE_INSTALL_PREFIX/doc
-DINSTALL_INCLUDEDIR=dir_name 安装头文件的路径,默认路径是DCMAKE_INSTALL_PREFIX/include
-DINSTALL_LIBDIR=dir_name 安装库文件的路径,默认路径是DCMAKE_INSTALL_PREFIX/lib
-DINSTALL_MANDIR=dir_name 安装帮助手册的路径,默认路径是DCMAKE_INSTALL_PREFIX/man
-DINSTALL_PLUGINDIR=dir_name 安装插件的路径,默认路径是DCMAKE_INSTALL_PREFIX/lib/plugin
-DINSTALL_SBINDIR=dir_name 安装mysqld服务端启动脚本的路径,默认路径是DCMAKE_INSTALL_PREFIX/bin
-DINSTALL_SCRIPTDIR=dir_name 初始化MySQL数据库的数据文件路径的mysql_install_db脚本路径,默认路径是DCMAKE_INSTALL_PREFIX/scripts
-DINSTALL_SQLBENCHDIR=dir_name 安装sql-bench的路径,默认路径是DCMAKE_INSTALL_PREFIX
-DINSTALL_SUPPORTFILESDIR=dir_name 安装支持文件的路径,默认路径是DCMAKE_INSTALL_PREFIX/support-files
-DMYSQL_TCP_PORT=port_num 服务器监听TCP/IP连接的端口,默认是3306
8.2.1 5.1版本源码安装
wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz
tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63
安装报错: checking for termcap functions library... configure: error: No curses/termcap library found
解决方法: yum install ncurses-devel -y
安装依赖:yum -y install ncurses-devel perl-Module-Install.noarch
编译参数1
./configure --prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--enable-assembler \
--enable-thread-safe-client \
--with-mysqld-user=mysql \
--with-big-tables \
--with-pthread \
--with-extra-charsets=complex \
--with-ssl \
--with-embedded-server \
--enable-local-infile \
--with-plugins=partition,innobase \
--with-plugin-PLUGIN \
make && make install
编译参数2
./configure --prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/usr/local/mysql/var \
--enable-assembler \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--with-pthread \
--enable-static \
--with-big-tables \
--without-ndb-debug \
--with-charset=utf8 \
--with-extra-charsets=all \
--without-debug \
--enable-thread-safe-client \
--enable-local-infile \
--with-plugins=max \
--with-embedded-server \
--with-ssl \
make && make install
- 设置服务
生成配置文件
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
配置MYSQL服务为系统服务
cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
- 设置开机启动
chkconfig --add mysqld # 增加服务
chkconfig --level 345 mysqld on # 增加开机项 - 建立系统账号
useradd mysql - 过入mysql安装目录
cd /usr/local/mysql
chown -R mysql.mysql /usr/local/mysql # 将安装目录所有者权限设为mysql用户
/usr/local/mysql/bin/mysql_install_db --user=mysql --datadir=/usr/local/mysql/var --basedir=/usr/local/mysql # 初始化数据库 --datadir=指定数据目录 --basedir=指定数据基础目录
chown -R mysql.mysql var # 修改var所有者
/usr/local/mysql/bin/mysqld_safe --user=mysql & # 服务后台启动
8.2.2 5.5以上版本安装方式:
安装依赖:yum -y install cmake ncurses-devel perl-Module-Install.noarch
useradd mysql -s /sbin/nologin
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_BIG_TABLES=1 \
-DWITH_DEBUG=0
make -j8 && make install -j8
初始化
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
添加服务
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig mysqld on
修改启动服务
vi /etc/rc.d/init.d/mysqld
basedir=/usr/local/mysql
datadir=/data/mysql
:wq!
bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
修改配置文件
vim /etc/my.cnf
datadir=/data/mysql
:wq
service mysqld start
添加环境变量
vi /etc/profile
export PATH=$PATH:/usr/local/mysql/bin
:wq!
添加sock
source /etc/profile
ln -s /var/lib/mysql/mysql.sock /tmp/
安装报错:
Curses library not found. Please install appropriate package,
按照错误提示,Debian/Ubuntu下需要安装libncurses5-dev;Redhat下需要安装ncurses-devel ,检查是否安装了ncurses包,如下所示,已经安装了ncurses-5.5-24.20060715,但是缺少ncurses-devel包。
yum install ncurses-devel -y
安装了ncurses-devel包后,删除CMakeCache.txt,然后重新编译,编译成功,问题解决!
预编译:
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_DATADIR=/home/mysql/data/ -DEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_DEBUG=0 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_USER=mysql
make && make install
这些参数的意思:
-DCMAKE_INSTALL_PREFIX=/data/mysql 准备安装到那里
-DEFAULT_CHARSET=utf8 默认的字符集
-DMYSQL_TCP_PORT=3306 数据库的监听端口
-DMYSQL_UNIX_ADDR=/tmp/mysql3306.sock 本机连回数据库的unix socket
-DWITH_DEBUG=0 关闭debug模式
-DWITH_INNOBASE_STORAGE_ENGINE=1 打开innodb引擎
项目删除:
CMake 默认不提供 uninstall 这个 target,想要的话,输入:
xargs rm < install_manifest.txt
8.2.3 5.7以上版本的配置方式
http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz
http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.10.tar.gz
cd mysql-5.7.11
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DDOWNLOAD_BOOST=1 \ #从MySQL 5.7.5开始Boost库是必需的
-DWITH_BOOST=../boost_1_59_0 \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DTRACE=0 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EMBEDDED_SERVER=1
make -j grep processor /proc/cpuinfo | wc -l
#编译很消耗系统资源,小内存可能编译通不过
make install
初始化数据库
注:
- 之前版本mysql_install_db是在mysql_basedir/script下,5.7放在了mysql_install_db/bin目录下,且已被废弃
- "--initialize"会生成一个随机密码(~/.mysql_secret),而"--initialize-insecure"不会生成密码
- --datadir目标目录下不能有数据文件
初始化:/usr/local/mysql/bin/mysqld --initialize --user=mysql
起服务:/usr/local/mysql/bin/mysqld_safe --user=mysql &
8.2.4 yum安装
https://dev.mysql.com/doc/refman/5.5/en/upgrading.html
release配置yum源:
官网:https://dev.mysql.com/downloads/repo/yum/
下载:
wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
安装:
rpm -ivh mysql57-community-release-el7-11.noarch.rpm (此版本源中包括5.5 5.6 5.7 )
【使用下面命令能关闭或开启mysql版本repo】
开启版本: yum-config-manager --enable mysql56-community
关闭版本: yum-config-manager --disable mysql57-community
yum-config-manager命令找不到的解决方法
这个是因为系统默认没有安装这个命令,这个命令在yum-utils 包里,可以通过命令yum -y install yum-utils 安装就可以了
安装命令各版本都一样:
yum install mysql mysql-devel mysql-server mysql-libs
注意: 安装5.5版本以上时,会提示依赖包libmysqlclient.so.16,请下载下列依赖包安装
下载链接:https://dev.mysql.com/downloads/mysql/5.5.html#downloads
Centos 6无法安装mysql5.5以上版本,需要事先解决依赖,至此未能解决。
################## mysql5.7以上默认有安全密码 #######################################
tail /var/log/mysqld.log
找到以下此条语句
[Note] A temporary password is generated for [email protected]: ZhweHhMyR8#l
登录后修改密码
alter user ‘root‘@‘localhost‘ identified by ‘123456‘;
#####################################################################################
8.3 Mysql 服务与端口
service mysqld restart
端口tcp:3306
/usr/local/mysql/share/mysql.server stop –socket=/var/lib/mysql/mysql.sock & 启动后台服务
/usr/loacl/mysql/bin/mysql/mysql.server stop 停止源码mysql服务
mysqladmin shutdown 平滑关闭mysql服务
8.4 Mysql 配置文件 /etc/my.conf
[[email protected] support-files]# ls -l my*.cnf
-rw-r--r--. 1 root root 4680 4月 25 01:05 my-huge.cnf 4
-rw-r--r--. 1 root root 19731 4月 25 01:05 my-innodb-heavy-4G.cnf 5
-rw-r--r--. 1 root root 4654 4月 25 01:05 my-large.cnf 3
-rw-r--r--. 1 root root 4665 4月 25 01:05 my-medium.cnf 1
-rw-r--r--. 1 root root 2433 4月 25 01:05 my-small.cnf 2
以上编号是指配置从小到大的排列 也是根据硬盘来选择相应的配置文件1-5
[mysqld] // 服务器端配置
datadir=/data/mysql // 数据库目录
socket=/var/lib/mysql/mysql.sock // 通信设置
user=mysql // 使用mysql用户启动
symbolic-links=0 // 是否支持快捷方式
log-bin=mysql-bin // 开启bin-log日志
server-id = 1 // mysql服务ID
auto_increment_offset=1 // 1~65535 自增长字段
auto_increment_increment=2 // 1~65535 自增长字段每次递增的量 默认为1
bind-address=10.204.3.4 // 接口监听地址
socket = /tmp/mysql.sock # 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(Linux下默认是/var/lib/mysql/mysql.sock文件)
port = 3306 # 指定MsSQL侦听的端口
key_buffer = 384M # key_buffer是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写)。索引块是缓冲的并且被所有的线程共享,key_buffer的大小视内存大小而定。
table_cache = 512 # 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。可以避免频繁的打开数据表产生的开销
sort_buffer_size = 2M # 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB
read_buffer_size = 2M # 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享。
query_cache_size = 32M # 指定MySQL查询结果缓冲区的大小
read_rnd_buffer_size = 8M # 改参数在使用行指针排序之后,随机读用的。
myisam_sort_buffer_size = 64M # MyISAM表发生变化时重新排序所需的缓冲
thread_concurrency = 8 # 最大并发线程数,取值为服务器逻辑CPU数量×2,如果CPU支持H.T超线程,再×2
thread_cache = 8 # #缓存可重用的线程数
skip-locking # 避免MySQL的外部锁定,减少出错几率增强稳定性。
[mysqldump]
max_allowed_packet =16M # 服务器和客户端之间最大能发送的可能信息包
skip-name-resolve
lower_case_table_names=1
innodb_file_per_table=1
back_log = 50
max_connections = 300
max_connect_errors = 1000
table_open_cache = 2048
max_allowed_packet = 16M
binlog_cache_size = 2M
max_heap_table_size = 64M
sort_buffer_size = 2M
join_buffer_size = 2M
thread_cache_size = 64
thread_concurrency = 8
query_cache_size = 64M
query_cache_limit = 2M
ft_min_word_len = 4
default-storage-engine = innodb
thread_stack = 192K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 64M
log-bin=mysql-bin
binlog_format=mixed
slow_query_log
long_query_time = 1
key_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 200M
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_io_threads = 8
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 16M
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 60
innodb_lock_wait_timeout = 120
master端
--binlog-do-db 二进制日志记录的数据库(多个数据库用,分隔)
--binlog-ignore-db 二进制日忽略的数据库(多个数据库用,分隔)
replicate-ignore-db=mysql 忽略同步库
在replication的slave端还有一下6个参数
--replication-do-db 设定需要复制的数据库(多个数据库用,分隔)
--replication-ignore-db 设定忽略复制的数据库(多个数据库用,分隔)
--replication-do-table 设定需要复制的表(多个表用,分隔)
--replication-ignore-table 设定忽略复制的表(多个表用,分隔)
--replication-wild-do-table同replication-do-table功能一样,但可以加通配符
--replication-wild-ignore-table=mysql.% 同replication-ignore-table功能一样 在从上添加测试通过
[mysqld_safe] // mysql服务安全启动配置
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
replicate-do-db =jfedu // 允许slave同步哪个库
key_buffer_size=16M 指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般为内存的50% show variables like ‘key_buffer_size‘;查询缓冲大小
max_connections = 3000 # 每个客户端连接最大的错误允许数量,如果达到了此限制,这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS”或者服务重启.
innodb_buffer_pool_size= 对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。
内存32G,24G
根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。
basedir = path # 使用给定目录作为根目录(安装目录)。
datadir = path # 从给定目录读取数据库文件。
pid-file = filename # 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统);
[mysqldump]
quick
max_allowed_packet = 256M
[mysql]
no-auto-rehash
prompt=\[email protected]\d \R:\m>
[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
8.5 Mysql 管理 帮助? HELP
8.5.1 查看mysql状态信息
查询当前连接进程
show processlist;
show status 查看当前会话的数据库状态信息
show global status; 查看整个数据库运行状态信息,很重要的分析并做好监控
show processlist; 查看正在执行的sql语句,
show full processlist 查看正在执行的完整sql语句,
set global key_buffer_size=32777218 不重启数据库调整参数,临时生效
show variables;查看数据库的参数信息,如my.cnf中参数是否生效
8.5.2 修改mysql字符集为UTF-8的方法:
show variables like "%char%"
在/etc/my.cnf对应如下配置段加入相应命令
[clinet]
字段加入default-character-set=utf8 客户端生效
[mysqld]
字段加入character-set-server=utf8
[mysql]
字段里加入default-character-set=utf8 本地生效
然后重启mysql服务
查询字符集文件
show character set;
8.5.3 解决mysql乱码的问题?
方法1:
- 检查建表语句,判断字符集类型show create table test_t0;
- 设置字符集set names latinl;
方法2:
导入数据的时候指定符字符
mysql -uroot -p123456 --default-character-set=latin1 discuz</backup/discuz.sql
方法3:
在my.cnf文件中加入字符集
[mysqld]
default-character-set=latinl 适合5.5以前
character-set-server=latinl 适合5.5以后
不乱码的思想,linux ,客户端,服务器端,库,表,程序都统一字符集,中英文环境尽量使用UTF8
8.5.4 mysql的历史命令保护
vi /root/.mysql_bistory # 创建mysql历史命令
ln -s dev/noull > mysql_history # 保户命令历史,创建成空文件
系统历史命令清除 bashrc history -c
8.5.5 Mysql远程管理 mysql -uroot -p -h 192.168.1.100
8.5.6 mysql交互式 mysql -uroot -p123456 -e “show databases;”
8.5.7 Mysql安全优化
删除空用户和多余用户
drop user ‘username‘@‘host‘
删除空用户
drop user ‘ ‘@‘host‘
8.5.8 mysql锁表
5.1版本: flush tables with read lock
5.5版本: flush table with read lock
解锁:
解锁跟系统的两个变量值有关,自动解锁时间
Wait_timeout = 28800
Interactive_timeout = 28800
1小时默认3600秒 8小时*3600秒=28800秒 24小时共86400秒
Show variables like “%timeout%”
8.5.9 数据库文件路径
mysql> show variables link ‘%datadir%‘;
8.5.10 Mysql的升级
官方升级网址
https://dev.mysql.com/doc/refman/5.5/en/upgrading.html
As part of the "Logical Upgrade", I had to add the --flush-privileges option when dumping because mysql didn‘t recognise the newly created users when restoring views. Additionally I added --triggers for completeness.
mysqldump --add-drop-table --routines --events --triggers --flush-privileges --all-databases --force -uroot -p > mysql_backup.sql
8.6 Mysql SQL语句(DDL DML DCL 语言)
SQL语句常见的分类
DDL 数据定义语言(CREATE ALTER DROP)
DML 数据操作语言(SELECT INSTER DELETE UPDATE)
DCL 数据控制语言(GRANT REVOKE COMMIT ROLLBACK)
结构化查询语言(Structured Query Language)简称SQL(发音:/?es kju? ?el/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
一:数据查询语言(DQL:Data Query Language):
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
二:数据操作语言(DML:Data Manipulation Language):
其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
三:事务处理语言(TPL):
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:数据控制语言(DCL):
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
五:数据定义语言(DDL):
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
六:指针控制语言(CCL):
它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作
8.6.1 mysql 的system命令
在命令行下,可以通过执行system命令,调用bash环境,比如
system ls /data/ 查看data目录下的文件
8.6.2 Mysql 数据库管理
8.6.2.1 select查询命令 select *();
查看当前库
mysql> select database();
查看当前用户
mysql> select user();
查看当前时间
mysql> select now();
8.6.2.2 切换当前库 use databases;
mysql> use mysql;
8.6.2.3 创建数据库 Create Database
create Database Discuz character set utf8
create database if not exists db_name 如果不存在就创建,不报错
# 查询数据库创建的历史命令
show create database discus;
查询字符集文件
show character set;
# 创建数据库并指定字符集
create database discuz default character set gbk collate gbk_chinese_ci;
create database discuz default character set utf8 collate utf8_general_ci;
8.6.2.4 数据库重命名
RENAME database olddbname TO newdbname
8.6.2.5 查看数据库 Show Databases
show databases;
show databases like ‘my%’;
# 查询数据库创建的历史命令
show create database discus;
6.2.6 删除数据库 Drop Database
drop datebase [if exists] db_name;
注:删除无法恢复
Drop database bbs; # 删除bbs数据库
8.6.3 Mysql 数据表操作
8.6.3.1 创建表:Create table tb_name (字段名 数据类型)
mysql> create table tutorials_tbl(
-> tutorial_id INT NOT NULL AUTO_INCREMENT,
-> tutorial_title VARCHAR(100) NOT NULL,
-> tutorial_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( tutorial_id )
-> );
+-----------------+--------------+------+-------+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+--------+------------+----------------+
| torial_id | int(11) | NO | PRI | NULL | auto_increment |
| tutorial_title | varchar(100) | NO | | NULL | |
| tutorial_author | varchar(40) | NO | | NULL | |
| submission_date | date | YES | | NULL | |
设置主键:
create table passwd2 (
id int(10) auto_increment PRIMARY KEY,
name char(20),
sex char(20)
);
例:create table students(name char(20) null,age char(10) null,sex char(10) null);
insert into students values(‘zhonglaing‘,‘23‘,‘man‘);
查询表的建表语句
show create table student\G;
\G
send command to mysql server ,display result vertically 发送命令到mysql server,垂直显示结果
生产创建表语句
CREATE TABLE subject_comment_manager
(subject_comment_manager_id
bigint(12) NOT NULL auto_increment COMMENT ‘主键‘,subject_type
tinyint(2) NOT NULL COMMENT ‘素材类型‘,subject_primary_key
varchar(255) NOT NULL COMMENT ‘索材的主键‘,subject_title
varchar(255) NOT NULL COMMENT ‘索材的名称‘,edit_user_nick
varchar(64) default NULL COMMENT ‘修改人‘,edit_user_time
timestamp NULL default NULL COMMENT ‘修改的时间‘,edit_comment
varchar(255) default NULL COMMENT ‘修改的理由‘,state
tinyint(1) NOT NULL default ‘1‘ COMMENT ‘0代表关闭,1代表正常‘,
PRIMARY KEY (subject_comment_manager_id
),
KEY IDX_PRIMARYKEY
(subject_primary_key
(32)),
KEY IDX_SUBJECT_TITLE
(subject_title
(32)),
KEY index_nick_type
(edit_user_nick
(32),subject_type
)
);
8.6.3.2 查看表: show tables
查看库中的表: show tables;
查年表中的结构: desc tabale_name;
8.6.3.3 删除表: Drop table tb_name
drop table [if exists] tb_name;
drop table bbs; # 删除bbs表
8.6.3.4 修改表:Alter table tb_name [ add|change|modify ]
alter table tb_name;
? 修改 modify 改属性 改数据类型
? 改变 change 改值 改名称
? 增加 add
? 删除 drop
? 增加:add
语法格式: alter table students add 字段名varchar(100) # 添加字段名 指定数据类型varchar
实例: alter talbe students add telphone int(20); # 增加telphone列,
alter talbe students add telphone int(20) first ; # 在第1列增加telphone列,
alter talbe students add telphone int(20) after name ; # 在name列后增加telphone列,
? 修改值:change
例: alter table students change “原字段1“ ”现字段2“ varchar(100) after name;
修改”原字段1”的字段名和类型,添加到Nmae字符之后
要指定源字段,新字段,新类型
alter table user change age ages varchar(100);
? 修改属性:modify
例: alter table users modify tel text(10);
修改tel字段的字段类型
? 删除列: drop
例:alter table user drop id;
删除user表中的id列
8.6.3.5 清空表:delete from tables | truncate table
delete 是逻辑删除,一行一行删
truncate 物理删除,清空物理文件
清空表的内容
delect from jf_t1;
清空表的内容
truncate table user;
6.3.6 复制一张表 create tables tb_name select * from tb_name
复制一张表和数据:
create table new_table select * from old_table;
- 复制一张表不复制数据
create table new_table select * from old_table where 0 ; - 只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
或者
CREATE TABLE 新表 LIKE 旧表 - 复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表 - 复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表 - 复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表
8.6.3.7 重命名表 rename table
Rename TABLE tb_name TO new_tb_name
? alter table rename tb_name to new_table 重命名表
8.6.3.8 查表结构 desc table
mysql> desc mysql.user;
-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum(‘N‘,‘Y‘) | NO | | N | |
8.6.4 Mysql 数据管理
6.4.1 插入数据:Insert into tb_name … values …
? 指定字段插入:
insert into tb_name (col1,col2,...)values (‘string‘,num,...);
插入数据 (字段名) VALUES值 (‘字符串’, 数值1-9)
字符串要单引 数值不需要
单行插入
例: insert into tb_name (id,name)values (‘1’,’zhongliang’)
可同时插入多行数据
多行插入
例: insert into student (name,sex) value (‘zhongliang‘.‘man’)(‘xiaoliang’,‘woman‘);
插入前先查询表的结果DESC tb_name 看哪些是必须插入值的
未指定的字段代表是允许为null的,可以不在字段位写,按顺序写上不允许为空的字段
? 不指定字段插入
不指定字段插入,代表全部都插入值
name age sex telnet
例:insert into students values (‘zhongliang‘,20,‘m‘,249765270);
语句插入1000条
create database hd;
create table techer (name char(20),tel char(20));
for i in seq 10000
;do mysql -e "use hd;insert into techer (name,tel) values (‘zhonglaing‘,‘123456789‘)";done
8.6.4.2 查询内容:select * from table;
where条件:and or < >
order排序:
order by id asc # 按id正序排序
order by id desc # 按id倒序排序
显示表的所有字段
describe user;
select 字段 frome tb_name where 条件1 [and | or] 条件2
select count(*) from user; 统计多少行
select * from user limit 10; 看10行 # 在生产环境中不要查所有,应为当上千条数据时会卡死
select from user where 列名>30; # 查询某列的值大于30的
select from user where 列名 like ‘%abc%’; # 查询某列的值包含匹配abc字符的所有内容
显示user表的第一行内容
select from user limit 1;
select from user limit 1,3; # 查看第1行第3行内容
select * from user where name="" limit 10\G;
select name from user where nam="";
内容匹配查询
select from user name link "%zhong%";
select from user name link "%zhong%" and name=xxx ;
排列显示,
select * from user where User=‘root‘ \G;
多表查询
select 表1.列1 , 表2.列2 , 表3.列3 from 表1,表2,表3 where 条件1 and 条件2
select user.id,student.name,address.tel from user,student,address where
8.6.4.3 修改数据:Update tb_name Set
update tb_name set 列名=“新值” where 列名=“value”; # id
例:update student set tel=249765270 where name=zhongliang;
修改zhongliang用户的tel电话
update mysql.user set host=‘localhost‘ where host=‘127.0.0.1‘ and user=‘root‘
8.6.4.4 删除数据:Delete From tb_name where
delete from tb_name where id=‘value‘;
例:delete form student where tel=249765270
8.6.5 Mysql 数据库备份还原
Xtranbackup 开源物理备份工具
备份分为逻辑备份和物理备份
逻辑备份:通过mysqldump备份过去
物理备份:通过将mysql目录的数据库文件拷贝过去
Mysqldump参数:
-A 备份所有库
-B 备份多个库 此参数使用后,自带create database语句,在恢复时,可以事先不建数据库就可忧复 如:mysqldump -uroot -p123456 </tmp/backup.sql
-x 锁表
-l 只读锁表
-C 压缩传输
--compact 去掉注释输出 用于调试
-d 备份表结构
-F 备份数据库时,切割blog日志,目的是防止备份数据与binlog重复,备份时记住binlog日志文件序号
--master-data=1 自动查找binlog日志位置节点 不需要手动入切割blog日志 与-F二选一
=1 ; 在binlog中添加一条不带注释的change master的post节点和binlog文件名,用于在slave上导入时,能自动记录post点和binlog文件位置,用于同步之后的binlog文件
=2: 在binlog中添加一条带注释的change master的post节点和binlog文件名
8.6.5.1 Mysql 全量备份与增量备份
全量备份:
全量部份就是将数据库完整备份,mysql -uroot -p -A -B >/backup/mysql.sql
innodb 引擎备份:
mysqldump -uroot -p --default-character-set=gbk --single-transaction -F -B discuz | gzip >/databackup/mysql.sql.gz
innodb 引擎备份:
mysqldump -uroot -p --default-character-set=gbk --lock-all-tables -F -B discuz | gzip >/databackup/mysql.sql.gz
企业场景全量和增量的频率是怎么做的呢?
- 中小公司,全量一般是每天一次,业务流量低谷执行全备,备份时要锁表
- 单台数据库,如何增量,用rsync(配合定时任务)把bin-log推送到远端备份服务器上
例:rsync -avz mysql-bin* [email protected]::backup --password-file=/etc/rsync.passwd - 大公司周备,每周六00点一次全备,下周日-下周六00点前都是增量
- 一主多从,会有一个从库做备份,延迟同步
mysql的备份什么场景下使用?
- 迁移或升级数据库的时候
- 添加从库
- 主库勿删除时,需要备份还原
- 跨机房灾备,需要备份
增量恢复全过程(针对前端可以暂停写入)
- 先对数据库进行锁表,防止新数据写入
- 找到全备和增备文件
grep -i "change" /backup/mysql.sql 找到全备最后的binlog的pos点位置,根据位置,找到增量的binlog日志文件 - 如果前端不能锁主库,这时要马上刷新binlog mysqladmin -uroot -p flush-logs 生成新的Binlog文件,这样可以判
断之后插入的数据会生成在新的binlog日志文件中 - 将需要增量恢复的binlog日志文件移动到新的目录,以防二次损坏
- 执行mysqlbinlog mysql-bin.0000014 >/databackup/binlog14.sql 将binlog日志生成sql语句
- vi /databackup/binlog14.sql 将勿操作语句删除,比如drop database之类的
增量恢复全过程(针对前端不可以暂停写入) 不停库不推荐
- 立即断开从的sql_threed线程,防止从读取relay-log日志,
- 将主mysql的binlog进行分割 -F
- 将主mysql的最新全部和出故障前的binlog日志进行恢复到从(前提要把日志中出问题的语句先删除)
- 然后将从提升为主mysql
- 将原主mysql被切割的后面用户写入的新数据的binlog日志恢复到现新的主mysql库
缺点:可能导致后期写入的数据不能插入,因为在你恢复的时候,有人又写入数据,导致主键冲突
最好的方案就是,在恢复最后写入数据时,暂停最短时间导入新数据。
生产场景2:
为了防止数据被勿删除,有些公司针对主从同步设置了某一台mysql从廷迟同步30-60分钟,这样做的目的是为了防止主数据库被执行勿删除时,从能保证数据完整并通过把主binlog增量部份的日志恢复到此从上,接替主的位置。
生产场影mysql数据恢复思路?
表重要的前题下:
- 停服务,挂维护页面 防止前端写入数据,保证数据一致性。
- 同时对故障的数据做一次备份,以防万一
- 恢复内存全量备份 根据post点位置,将相应的binlog日志恢复
- 启动测试
8.6.5.2 Mysql备份数据库
? 备份所有数据库
mysqldump -uroot -p -B -A --events > all.sql # 备份服务器中所有的库
? 备份mysql 使用root用户,密码123456 备份到/tmp/
mysqldump -uroot -p123456 -B mysql > /tmp/mysql2016.sql
? 数据库压缩备份
mysqldump -uroot -p123456 discuz | gzip > backupfile.sql.gz
解压:gzip -d backupfile.sql.gz
? 同时备份多个MySQL数据库
mysqldump -uroot -p123456 -B databasename1 databasename2 databasename3 > multibackupfile.sql
? 仅仅备份数据库结构
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
? 跨主机备份
使用下面的命令可以将host1上的sourceDb复制到host2的targetDb,前提是host2主机上已经创建targetDb数据库:
mysqldump -uroot -p sourceDb | mysql –uroot –p --host=192.168.1.100 -C targetDb
-C指示主机间的数据传输使用数据压缩
目标主机必须gran授权允许源主机连接
mysqldump: Got error: 1016: Can‘t open file: ‘./BBS/pre_home_feed.frm‘ (errno: 24) when using LOCK TABLES
mysqldump -uroot -p123456 BBS --lock-tables=false > /data/bbs.sql
mysqldump -uroot -p123456 -A -B --events --master-data=2 -x > /backup/all.mysql
企业常规备份 myisam
mysqldump -uroot -p123456 -A -B --master-data=2 -x dicuz|gzip >/backup/all.sql.gz
企业常规备份 inodb
mysqldump -uroot -p123456 -A -B --master-data=2 -x --single-transaction dicuz|gzip >/backup/all.sql.gz
for myisam
mysqldump --user=root --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triggers --routines --envents --hex-blob >/data/mysqlall.sql
for innodb
mysqldump --user=root --all-databases --flush-privileges --single-transaction --master-data=1 --flush-logs --triggers --routines --envents --hex-blob>/data/mysqlall.sql
8.6.5.3 Mysql基于slave备份数据
使用tar,copy,rsync来备份
在slave的my.cnf增加log-slave-updates配置,使slave也产生binlog日志文件
8.6.5.4 Mysql廷时备份
6.5.5 Mysql恢复数据库
注意: mysql在恢复数据库的时候,最好像原数据库清除重新初始化,并重新change master,记得要重启数据库同步才会生效,
恢复库
mysql> mysql –uroot zhongliang < /tmp/zhongliang.sql;
恢复数据库 先创建数据库名,再恢复
还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
8.6.5.6 Mysql bin-log日志
8.6.5.6.1 问:mysql的binlog日志的作用是什么
用来记录Mysql内部“增”“删“ “改”等对mysql数据库有更新的内容的记录
8.6.5.6.2 查看binlog日志命令
/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/3306/mysql-bin.000001
8.6.5.6.3 切割log-bin日志
mysqladmin -uroot -p123456 flush-log
8.6.5.6.4 通过binlog日志恢复数据
-d 指定数据库恢复
【注意】
通过binlog做增量恢复丢失数据的数据库时,binlog日志里面记录着所有数据库的语句,如果整个直接恢复,会导致未丢失数据库的数据冲突,所以我们恢复的时候,一定导出binlog日志的时候要加-d参数导出只出问题的数据库
【注意】
将binlog导成sql的时候,别在mysql的工作目录下直接导,而是将binlog备份出来后再导成sql文件,以免在导的过程中出错而binlog又记录了新的记录,导致无法成功导入数据
- 将binglog日志生成sql文件
mysqlbinlog mysqlbin.000001>/backup/bin.sql - vi 修改/backup/bin.sql
找到时间点出问题的地方,比如有drop 的语句,
找到出问题的语句,删除不要的语句
- 恢复
mysql -uroot -p123456 discuz</backup/bin.sql
8.6.5.6.5 从binlog中只恢复discuz数据库的语句
mysqlbinlog -d disczu mysql-bin.000001 >/backup/discuz.sql
6.5.6.6 mysql-binlog指定时间和节点恢复:
查看binlog日志的命令:mysqlbinlog mysql-bin.000001 |more
备份:cp mysql-bin.000001 /data/back/20150411/
恢复1: mysqlbinlog --start-position=215 --stop-position=336 mysql-bin.000001 | mysql -uroot -p
注,在勿操作的结点前面开始恢复,stop的post点的肖前点的记录不会执行!!!
恢复2:mysqlbinlog --start-datetime="2016-10-18 22:18:25" --stop-datetime="2016-10-18 22:28:38" log.000002 >/home/mysql.sql
use 进入到库里
source /home/mysql.sql
8.6.5.6.7 远程备份binlog日志
mysqlbinlog --read-from-remote-server --host=192.168.1.100 --port=3306 --user=root --password 123456 --raw --stop-never --result-file=/backup/mysql-bin.0000001
8.6.5.7 Mysql备份表
Mysqldump –uroot –p123456 discuz user > /tmp/user.sql;
备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename table1 table2 > backupfile.sql
6.5.8 Mysql恢复表
Mysql>system ls /tmp查看文件
Mysql> source /tmp/mysql.sql;
在进入数据库中执行
6.5.9 Mysql 分库分表脚本
企业级MySQL分库分表备份策略以及实战操作精讲视频课程
edu.51cto.com/course/course_id-808.html
6.5.10 Mysql备份表结构
只备份表结构desc ,不备份数据
mysqldump -uroot -p123456 -d discuz > discuz.sql
8.6.6 Mysql 权限管理
8.6.6.1 创建用户 create user
Create user ‘username’@’Iphost’ identified by ‘password‘
例: create user ‘zhongliang‘@‘%‘ identified by ‘123456‘
8.6.6.2 删除用户 drop user
方法1:
drop user ‘username‘@‘host‘
方法2:
delete from mysql.user where user=‘root‘ and host=‘loaclhost‘
删空用户
drop user ‘ ‘@‘host‘
故障案例:有时drop删除用户删除不了,
drop user ‘‘@‘%‘;
ERROR 1396 (HY000):Operation DROP USER failed for ‘‘@‘%‘;
解决方法:delete from mysql.user where user=‘‘ and host=‘%‘
8.6.6.3 设置权限 grant all
grant all(所有权) on [(数据库).(表)] to (用户)[email protected]‘IP地址‘ identified by ‘密码‘;
注意: 在授权前,如果你是通过hostname来连接mysql数据库,在授权时就要指定主机名,如果是通过IP连接数据库,授权时就使用IP
权限:
all privileges 所有权限
USAGE 默认权限 只限登录 无操作权限
select 查询
insert 插入
delete 删除
update 更新
create 创建
alter 修改
drop 删除
references 外键
create temporary table 临时表
index 索引
create view 创建视图
show view 查询视图
create routine 存储过程
alter routine
execute
主机通配
方法1
:grant all privileges on mydb.* to ‘zhongliang‘@‘%‘ identified by ‘123456’
给zhongliang所有权限
方法2:
grant all on mysql to [email protected]”127.0.0.1” identified by ‘123456‘ with grant option;
grant all on mysql to [email protected]”192.168.1.0/255.255.255.0” identified by ‘123456‘ with grant option;
grant all on mysql to [email protected]”192.168.1.%” identified by ‘123456‘ with grant option;
方法3:
grant select delete insert update on mysql to [email protected]”127.0.0.1” identified by ‘123456‘ with grant option;
grant select(user_id,username) on smp.users
grant select(id, se, rank) on testdb.apache_log
刷新权限
flush privileges;
企业如何授权
博客,CMS等产品的数据库授权
select insert update delete create drop
6.6.4 查询权限 show grants
Show grants for ‘zhongliang‘@‘%‘
查询某个IP是否有授权
select * from mysql.user where Host=”192.168.1.100” \G
6.6.5 取消权限 revoke all
Revoke all privileges on mysql.* from ‘root’@’localhost’;
revoke select on mysql.* from ‘root’@’localhost’
6.6.6 Mysql忘记密码如何破解、
先停止Mysql服务,然后以跳过权限方式后台启动
/usr/bin/mysqld_safe --user=mysql --skip-grant-tables & # skip-grant-tables 跳过权限表启动
- Mysql 进入数据库 mysql –uroot -p
- 执行update user set password=password(‘123456‘) where user=‘root‘ and host=’ ’; 修改密码
加了and host可以只删一条,否则是root都删了 - Flush privileges;
- mysqladmin -uroot -p123456 shutdown 杀掉之前启动的服务
- 再用正常方式启动mysql /usr/bin/mysqld_safe --user=mysql &
Mysql5.7
select user,host, authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *483BC6A182B359EA37FD0AEA0D178EE888ECF154
8.6.6.7 多实例mysql启动修改丢失root密码
- killall mysqld
- mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-table &
- mysql -uroot -p -s /data/3306/mysql.sock
- update user set password=password(‘123456‘) where user=‘root‘ and host=’ ’;
- flush privileges;
- mysqladmin -uroot -p123456 shutdown 杀掉之前启动的服务
- /usr/bin/mysqld_safe --user=mysql -s /data/3306/mysql.sock &
8.6.6.8 mysql高版本默认密码
tail /var/log/mysqld.log
找到以下此条语句
[Note] A temporary password is generated for [email protected]: ZhweHhMyR8#l
5.7不能使用update mysql.user set方式改密码
alter user ‘root‘@‘localhost‘ identified by ‘123456‘;
8.6.6.9 修改服务器root的密码:
方法1:root密码为空时
mysqladmin –uroot password ‘123456’
方法2:root有密码时修改密码
mysqladmin –uroot –p123456 password ‘456789’;
方法3:命令行修改密码
update mysql.user set password=password("123456") where host=‘127.0.0.1‘ and user=‘root‘
update users set passwd=md5("woshitiancai") where userid=‘1‘;
flush livileges; 刷新权限的作用是从内存写入硬盘
方法4:命令行修改当前登录mysql用户的密码
set password=password(‘123456‘);
方法5:多实例时修改数据库密码
mysqladmin –uroot password ‘123456’ –s /tmp/mysql.sock
更改mysql5.7密码
8.6.6.10 root权限丢失怎么解决?
更新的MYSQL.USER表的所有字段中为N的为Y就可以了。
update user set Select_priv =‘Y‘ where user = ‘root‘;
update user set Insert_priv =‘Y‘ where user = ‘root‘;
update user set Update_priv =‘Y‘ where user = ‘root‘;
update user set Delete_priv =‘Y‘ where user = ‘root‘;
update user set Create_priv =‘Y‘ where user = ‘root‘;
update user set Drop_priv =‘Y‘ where user = ‘root‘;
update user set Reload_priv =‘Y‘ where user = ‘root‘;
update user set Shutdown_priv =‘Y‘ where user = ‘root‘;
update user set Process_priv =‘Y‘ where user = ‘root‘;
update user set File_priv =‘Y‘ where user = ‘root‘;
update user set Grant_priv =‘Y‘ where user = ‘root‘;
update user set References_priv =‘Y‘ where user = ‘root‘;
update user set Index_priv =‘Y‘ where user = ‘root‘;
update user set Alter_priv =‘Y‘ where user = ‘root‘;
update user set Show_db_priv =‘Y‘ where user = ‘root‘;
update user set Super_priv =‘Y‘ where user = ‘root‘;
update user set Create_tmp_table_priv =‘Y‘ where user = ‘root‘;
update user set Lock_tables_priv =‘Y‘ where user = ‘root‘;
update user set Execute_priv =‘Y‘ where user = ‘root‘;
update user set Repl_slave_priv =‘Y‘ where user = ‘root‘;
update user set Repl_client_priv =‘Y‘ where user = ‘root‘;
update user set Create_view_priv =‘Y‘ where user = ‘root‘;
update user set Show_view_priv =‘Y‘ where user = ‘root‘;
update user set Create_routine_priv =‘Y‘ where user = ‘root‘;
update user set Alter_routine_priv =‘Y‘ where user = ‘root‘;
update user set Create_user_priv =‘Y‘ where user = ‘root‘;
update user set Event_priv =‘Y‘ where user = ‘root‘;
update user set Trigger_priv =‘Y‘ where user = ‘root‘;
8.6.7 mysql 索引
8.6.7.1 概述
表索引:相当于一个表的目录 可以加快速度访问
1) 普通索引
2) 唯一索引
3) 主索引
4) 外键索引
5) 复合索引
索引就像书的目录一样,如果在字段上建立索引,那么以索引列为查询条件时可以加快查询数据的速度,
主建索引
查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列,主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一
8.6.7.2 查看条件字段列的唯一性(检查列不重复的)
select count (distinct ader) from ad_oldboy_detail;
8.6.7.3 用explain命令检查语句的执行情况
mysql> explain select * from mysql.user\G;
1. row
id: 1
select_type: SIMPLE
table: user
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
Extra:
1 row in set (0.00 sec)
ERROR:
No query specified
8.6.7.4 建立主键索引的方法:
- 在建表时,可以增加建立主链索引的语句如下
create table student(
id int(4) not null AUTO_INCREMENT,
name char(20) not null,
age tinyint(2) NOT NULL default ‘0‘,
dept varchar(16) default NULL,
primary key(id),
KEY index_name(name)
);提示:primary key(id), 主键
KEY index_name(name) name字段普通索引
在唯一值多的列上建索引查询效率高通过desc student查看到的表结构中,可以看到两个主键
PRI为主键的标识,MUL为普通索引的标识- 建表后通过alter命令增加主键索引(不推荐)
主建列不能重复创建,必须先删除历史配置
alter table student drop primary key;手动设置id列添加主键
alter table student change id int parmary key auto_increment;
建立普通索引的方法:
- 在建表时,可以增加建立普通索引的语句如下:
create table student(
id int(4) not null AUTO_INCREMENT,
name char(20) not null,
age tinyint(2) NOT NULL default ‘0‘,
dept varchar(16) default NULL,
primary key(id),
KEY index_name(name)
);提示:KEY index_name(name) name字段普通索引
删除普通索引
alter table student drop index index_name
在name字段增加普通索引
alter table student add index index_name(name);
在dept的前8个字符创建索引
create index index_dept on student(dept(8));
查询索引
show index from student\G;
为两个列创建联合索引(允许列上有自已的索引)
create index ind_name_dept on sutdent(name,dept);
多个列前n个字符创建联合索引
create index ind_name_dept on sutdent(name(8),dept(10));
创建唯一索引(非主键)的方法:
create unique index index_name on student(name);
6.7.5 索引列的创建及生效条件
问题1:既然索引可以加快查询速度,更新数据时还需要维护索引数据的,因此,索引是一把双刃剑,并不是越多越好,
例如:数十到几百行的小表上无需建立索引,更新频繁,读取比较少的表要少建立索引
问题2:需要在哪些列上创建索引呢?
select user,host from mysql.user where host= 索引一定要创建在where后的条件列上,而不是select 后的选择 数据列,别外,我们要尽量选择在唯一值多的大表上的列建立索引
索引注意条件
- 要在表的列上创建索引
- 索引会加快查询速度,但是会影响更新的速度
- 索引不是越多越好,要在频繁查询的where后的条件列上创建索引
- 小表或唯一值极少的列上不建索引,要在大表以及不同内容多的列上创建索引
8.7 MySQL 慢查询
慢查询日志分析工具
mysqldumpslow,mysqlla,myprofi,mysql-explain-slow-log,mysqllogfilter
语句插入1000条
for i in seq 1 10000
;do;mysql -e "use hd;insert into t1 value (‘zhonglaing‘,‘20‘);";done
8.7.1 查看当前mysql慢查询状态
show variables like "%slow%";
| log_slow_queries | OFF
| slow_launch_time | 2 | 超过2秒定义为慢查询。
| slow_query_log | OFF | 慢查询关闭状态。
| slow_query_log_file | /data/mysql/var/db-Test2-slow.log | 慢查询日志的文件。
8.7.2 开启慢查询日志方法
临时开启:set global slow_query_log=on;
永久开启: 在my.cnf中添加,如下:
slow_query_log=on
slow_query_log_file = /data/mysql/var/db-Test2-slow.log #日志目录。开启慢日志查询 long_query_time = 0.1 #记录下查询时间查过1秒。 log-queries-not-using-indexes #表示记录下没有使用索引的查询。
log-long-format
8.7.3 mysqldumpslow分析日志
【参数】
-s,是order的顺序
al 平均锁定时间
ar 平均返回记录时间
at 平均查询时间(默认)
c 计数
l 锁定时间
r 返回记录
t 查询时间
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
1:假如真正的sql语句如下:
SELECT * FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
mysqldumpslow显示的结果会是:
Count: 1 Time=1.91s (1s) Lock=0.00s (0s) Rows=1000.0 (1000), vgos_dba[vgos_dba]@[10.130.229.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;
2:如果我们再执行一条
SELECT * FROM sms_send WHERE service_id=20 GROUP BY content LIMIT 10000, 1000;
mysqldumpslow显示的结果会是:
Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;
mysqldumpslow的分析结果
Count会告诉我们这种类型的语句执行了几次
Time会告诉我们这种类型的语句执行的最大时间
Time=2.79s (5s)中(5s)是指这类型的语句执行总共花费的时间
例:
Count: 2 Time=2.79s (5s) Lock=0.00s (0s) Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
告诉我们执行了2次
最大时间是2.79s
总共花费时间5s
lock时间0s
单次返回的结果数是1条记录
2次总共返回2条记录
mysqldumpslow -s r -t 10 /data/mysql/var/db-Test2-slow.log
8.8 Mysql 远程管软件 phpmyadmin navicat sqlyog
http://www.phpmyadmin.net/downloads/
8.8.1 phpmyadmin安装
安装phpMyAdmin,一个客户端管理工具
1、到官网下载phpMyAdmin-3.5.2.2-all-languages.tar.gz
2、解压 tar -zxvf phpMyAdmin-3.5.2.2-all-languages.tar.gz
3、将解压后的文件夹重命名为phpMyAdmin,放到apache的站点目录下
4、在浏览器中输入http://localhost/phpMyAdmin/index.php 即可看到管理界面了。
需要支持php5.5以上版本
8.8.2 phpmyadmin配置
配置文件
/var/www/html/mysql/libraries/config.default.php
$cfg[‘PmaAbsoluteUri‘] = ‘‘; # 这里填写 phpMyAdmin 的访问网址
$cfg[‘Servers‘][$i][‘host‘] = ‘localhost‘; # 服务器IP或127.0.0.1 不能使用localhost
$cfg[‘Servers‘][$i][‘port‘] = ‘‘; # 默认端口3306
$cfg[‘Servers‘][$i][‘user‘] = ‘root‘; # 默认用户名
fg[‘Servers‘][$i][‘password‘] = ‘‘; # 密码
$cfg[‘Servers‘][$i][‘auth_type‘] = ‘cookie‘; # 验证类型
四种模式可供选择,cookie,http,HTTP,config
config 方式即输入 phpMyAdmin 的访问网址即可直接进入,无需输入用户名和密码
当该项设置为 cookie,http 或 HTTP 时,登录 phpMyAdmin 需要数据用户名和密码进行验证,具体如下:
PHP 安装模式为 Apache,可以使用 http 和 cookie;
PHP 安装模式为 CGI,可以使用 cookie。
8.8.3 phpmyadmin排错
? 错误提示:
修改配置文件中:
$cfg[‘Servers‘][$i][‘host‘] = ‘localhost‘;
更换成
$cfg[‘Servers‘][$i][‘host‘] = ‘127.0.0.1‘;
? 错误提示:
phpmyadmin提示:The mbstring extension is missing. Please check your PHP configuration
yum install php-mbstring –y
The mysqli extension is missing. Please check your PHP configuration. See our documentation for more information.
安装yum install php-mysql –y
php增加mysqli扩展
正在运行的php上增加mysqli扩展,基本方法与加载其他扩展一样,就是不用再单独下载扩展包了,php安装包里就自带,找到你当前php运行的版本,我的是php-5.2.10,具体方法如下:
tar -zxf php-5.2.10.tar.gz
cd php-5.2.10/ext/mysqli
/usr/local/php/bin/phpize ##生成configur文件
./configure –with-php-config=/usr/local/php/bin/php-config –with-mysqli=/usr/local/mysql/bin/mysql_config ##这里可能会不一样,根据你php和mysql的安装路径而定。
make
make install ##完成后有以串路径,把他复制下来,一会要用,我的返回是/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613
vi /usr/local/php/lib/php.ini ##php.ini这里可能也会不一样,有的会在/usr/local/php/etc下,也有在/etc下的。
在最后一行加入如下字段
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/mysqli.so
其中mysqli.so前边的路径就是make install后返回的路径
重启php服务或是apache服务,我这里是apache
/etc/init.d/httpd restart
在php-5.2.10/ext中有很多这样的模块,都可以用以上方法实现。
8.9 MySQL 数据库优化
Mysql的优化:一般分为配置的优化、sql语句的优化、表结构的优化、索引的优化,而配置的优化:一般包括系统内核优化、mysql本身配置文件的优化。
MySQL常见的优化参数详解:
8.9.1 硬件上的优化:
增加内存和提高磁盘读写速度,都可以提高MySQL数据库的查询,更新的速度。另一种提高MySQL性能的方式是使用多块磁盘来存储数据。因为可以从多块磁盘上并行读取数据,这样可以提高读取数据的速度。
a. CPU
b. 内存
c. disk 数量越多越好,种类 ssd > sas > stat
raid 4块盘 性能排序 RAID0 > RAID10 > RAID5 > RAID1
d. 网卡 多块网卡bond 以及buffer,tcp优化
8.9.2 软件优化
操作系统:x86_x64位,对线程支持多线程
软件: mysql编译优化 对编译参数
8.9.3 MySQL参数的优化:
my.cnf里参数的优化的幅度很小,大部份只能通过架构以及sql语句优化
下面对几个重要的参数进行详细介绍:
1) key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快。 配置内存的80%
2) table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。
3) query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0。
4) Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。
5) Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。 参考值为1000
6) sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。
7) Innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。官方建议内存的80% 合理值30-50
附一个真实环境MySQL配置my.cnf内容,可以根据实际情况修改:
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
server_id = 10
port = 3306
socket = /tmp/mysql.sock
datadir = /data/mysql/data1
old_passwords = 1
lower_case_table_names = 1
character-set-server = utf8
default-storage-engine = MYISAM
log-bin = mysql-bin
log-error = /usr/local/mysql/var/error.log # 错误日志
open_files_limit = 10240 # 打开文件描述符
pid-file = mysql.pid
long_query_time = 2 #秒
slow_query_log
slow_query_log_file = /usr/local/mysql/var/slow.log
log-slow-queries=/usr/local/mysql/var/slow-log # 慢查询文件
binlog_cache_size = 4M
relay-log = /usr/local/mysql/var/relay-bin
relay-log-info-file = /usr/local/mysql/var/relay-log.info
binlog_format = mixed
max_binlog_cache_size = 16M
max_binlog_size = 1G
expire_logs_days = 30 # binlog过期天数
ft_min_word_len = 4
back_log = 512
max_allowed_packet = 64M # 服务端与客户端连接的最大允许包的大小
max_connections = 4096 # 最大连接数
max_connect_errors = 100
join_buffer_size = 2M # 连接缓冲
read_buffer_size = 2M
read_rnd_buffer_size = 2M
sort_buffer_size = 2M # 排序缓冲区,每一个线程的大小 不能太大,因为当并发高的时候,累计就大了
query_cache_size = 64M
table_open_cache = 10000
thread_cache_size = 256 # 线程缓存
max_heap_table_size = 64M
tmp_table_size = 64M # 临时表,会占用磁盘空间,可以给大点,但不能太大
thread_stack = 192K
thread_concurrency = 24
local-infile = 0
skip-show-database
skip-name-resolve # 如果不加,会有报权限错误 mysql会对Ip做dns反查询,导致大量的连接处理Login状态
通过show processlist发现大量类似如下的连接:
|592|unauthenticated user|192.168.3.20:35320|NULL|Connect| |login|NULL|
skip-external-locking
connect_timeout = 600
interactive_timeout = 600 # 关闭上一次连接的超时时间
wait_timeout = 600 # 连接超时
# MyISAM
key_buffer_size = 512M # 索引缓存 用于myisam引擎
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 64M
myisam_max_sort_file_size = 1G
myisam_repair_threads = 1
concurrent_insert = 2
myisam_recover
# INNODB
innodb_buffer_pool_size = 16G
innodb_additional_mem_pool_size = 32M
innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend # innodb引擎数据文件 初始1G,自动扩充
innodb_read_io_threads = 8
innodb_file_io_threads = 4 #
innodb_write_io_threads = 8
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 2 # 提交参数 提交后是否刷新log
innodb_lock_wait_timeout = 120
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_thread_concurrency = 16 # 并发线程
innodb_open_files = 10000
#innodb_force_recovery = 4
#*** Replication Slave
read-only
#skip-slave-start
relay-log = relay.log
log-slave-updates
思想:
监控:对每个参数进行监控他使用情况
show global status\G;
参数检测:命令:mysqlreport mysql性能调优工具
http://www.day32.com/MySQL/tuning-primer.sh
8.9.4 SQL语句优化
a. 索引优化
慢查询日志分析工具
mysqldumpslow,mysqlla,myprofi,mysql-explain-slow-log,mysqllogfilter
每天晚上定时分析慢查询,发给开发,DBA,CTO邮箱
b. 大的复杂的sql语句拆分成多个小的sql
子查询,JOIN连表查询,某个表4000万条记录
c. 数据库是存储数据的地方,但是不是计算数据的地方,
对数据计算,应用类处理,都要拿到前端应用解决,禁止在数据库上处理
d. 搜索引擎功能,一般不要使用mysql数据库
8.9.5 架构上的优化
a. 业务拆分
b. 数据库的前端必须加cache 例如:memcached 例如:用户登录,商品查询
c. 某些业务应用使用nosql持久化存储,例如memcahcedb redis ttserver
d. 动态的数据静态化,整个文件静态化,页面片段静态化
e. 数据库集群与读写分离 一主多从 通过程序或dbproxy进行集群读写分离
f. 单表超过2000W,可进行拆库拆表
g. 双主 读写分离 从库一定要设置read_olny
h. 双主,双从
8.9.6 流程,制度,安全优化
任何一次人为数据库记录的更新,都要走一个流程
a. 人的流程,开发--核心开发---运维DBA
b. 测试流程,内网测试--IDC测试--线上执行
c. 客户端的管理phpmyadmin
8.9.7 搜索引擎优化方案:
- 从业务上实现用户登录后再搜索,这样减少搜索次数,从而减轻数据库服务的压力
- 如果有大量频繁的搜索,一般是爬虫在爬你的网站,分析web,IP封掉(AWSTATS)
- 配置多个主从同步,程序实现读写分离,(最好让LIKE ‘%关键词%‘)这样的查询去从库查询,减轻主库读写压力
- LIKE ‘%关键词%‘一般很难优化,可以通过搜索服务Sphinx实现搜索
- 当然还可以利用c,ruby开发程序,实现每日读库计算搜索索引,保存在服务器上提供搜索,然后每5分钟做一次,
- 在前端加memcached缓存
8.10 Mysql 主从同步
8.10.1 主从原理
mysql主从同步的原理:
1、在master上开启bin-log日志,用于记录master上的更改删的一些记录。
2、主从各开启io线程,从上开启io线程和sql线程。同时都配置好主从上的serveid唯一性
3、主上配置好授权用户,从上设置change master授权连接的命令
3、 从上io线程通过授权连接master,master通过io线程检查到slav的请求的日志、postsion点位置。
4、master将这些相应的请求内容发送给slave,slave收到后,将内容存放在中继日志realy_log里面,同时生成写入一个master-info,写入日志记录和pos点。用于下次连接的记录
日志记录同步的点。
5、slave的sql线程检查到realy-log日志更新的内容,并将更新的内容解析成sql语句然后在本地去exec执行。同时也将记录写入realy-info
6、主从同步是属于异步方式。
8.10.2 主从同步状态
mysql> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 10.204.3.13
Master_User: tongbu
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 239948407
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 30462462
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 239948407
Relay_Log_Space: 112003215
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
IO线程和SQL线程都为YES
Master_Log_File: mysql-bin.000004
Relay_Master_Log_File: mysql-bin.000004
主日志文件和从读取的文件为同一个
Read_Master_Log_Pos: 239948407
Exec_Master_Log_Pos: 239948407
读取主日志的偏移量和执行主日志的偏移量相等
show processlist;
show slave status;
sending binlog event to slave;
二进制日志由各种事件组成,一个事件通常为一个新加一些其它信息,线程已经从二进制日志读取了一个事件并且正将发送到从服务器
finished reading one binlog;switching to next binlog
线程已经读完二进制日志文件并且打开下一个要发送到从服务器的日志文件
has sent all binlog to slave;waiting for binlog to be updated
线程已经从二进制日志读取所有主要的更新并已经发送到了从服务器,线程现在正空闲,等待由主服务器上新的更新导致的出现在二进制日志中的新事件
waiting to finalize termination
线程停止时发生的一个很简单的状态
原文地址:http://blog.51cto.com/zhongliang/2152916