之前一直对mysql半调子状态,没有深入研究....本周任务,sql进阶.

1.mysql帮助的使用.

最直接简单方便,查看命令的使用相当于man手册 

mysql> ? contents

mysql> ? data types   

mysql> ? show

2.表类型(存储引擎的选择)

2.1 mysql存储引擎的概述

mysql支持多种存储引擎,处理不同类型的应用时,可以通过选择不同的存储引擎提高应用的效率,或提供灵活的存储.

这里只列常用的2种存储引擎:

1)Myisam是mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。

 每个Myisam在磁盘上存储成三个文件,文件名都和表名相同,扩展名分别是.frm(存储表定义),MYD(MYData存储数据),MYI(MYIndex存储索引)。数据和索引文件可以放置不同目录,平均分布io,以提高更快速度。

2) InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全,但相比而言写的处理效率差一些且会占用更多的磁盘空间以保留数据和索引。

=============================================================

mysql结构:

connections: ODBC,PHP,PERL,PYTHON,RUBY......
mysql server:connection pool sql interface,iptimizer,caches&buffer.....
storage engines: myisam  inonodb......引擎的区别

mysql版本选择:GA社区版
稳定版:5.0.xx  5.1.xx 版   5.5.xx最新版

mysql用户:
mysql用户和组的创建
useradd -s /sbin/nologin -g mysql -M mysql 创建家目录

mysql目录:
/var/lib/mysql

mysql安装:
1.源码包安装
常用编译参数:
#./configure \
--prefix=/usr/local/mysql \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--localstatedir=/var/lib/mysql \
--enable-assembler \                   #-->允许使用汇编模式(优化性能)
--with-mysqld-ldflags=-all-static  \    #-->服务器使用静态库(优化性能)
--with-client-ldflags=-all-static  \    #-->客户端使用静态库(优化性能)
--enable-thread-safe-client        \    #-->以线程方式编译客户端
--with-mysqld-user=mysql           \    #-->指定mysql运行的系统用户

.................

#make -j 4 加CPU使用个数来加速安装

2.rpm包安装  mysql-server  mysql-client

mysql配置文件详解:
cp support-files/my-*.cnf /etc/my.cnf

创建mysql数据文件:
mkdir -p /var/lib/mysql
chown -R mysql.mysql /var/lib/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql  初始化mysql数据文件

启动数据库(单实例):
法一:mysqld_safe &     或mysqld_safe --user=mysql &     关闭killall mysqld
法二:cp support-files/mysql.server /etc/init.d/mysqld     mysql的启动脚本
chmod 700 /etc/init.d/mysqld
/etc/init.d/mysqld start
加入开机启动chkconfig --add mysqld && chkconfig mysqld on
多实例:


配置mysql命令全局使用路径:
法一:echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile   
source /etc/profile
法二:将安装目录下mysql命令拷贝到全局系统命令路径/usr/local/sbin下
cp /usr/local/mysql/bin/mysql /usr/local/sbin/


登陆mysql测试:   默认安装好后,管理帐号root是无密码的可直接进入mysql
登录方式(单实例):
#mysql
#mysql -uroot
#mysql -uroot -p
#mysql -uroot -p'123456'  脚本中使用,命令行不建议
mysql>show databases;
infomation_schema    -->mysql系统库
mysql                -->mysql权限库
test                 -->mysql测试库
mysql>select user();查看当前的登录用户
mysql>select user,host from mysql.user;
多实例:

 

mysql安全配置:
增加root密码
#mysqladmin -uroot password '123456'
mysql>select user,host from mysql.user;
mysql>drop user ""@localhost; 删除没必要的空用户
mysql>drop user xx@xx;

mysql安装完后:
1.获取mysql配置文件
2.创建mysql数据目录,授权mysql用户访问
3.初始化数据库文件mysql_install_db --user=mysql
4.启动服务mysqld_safe & 或 拷贝启动脚本方式来启动cp support-file/mysql.server /etc/init.d/mysqld
加入全局路径/etc/profile  PTAH中,source /etc/profile生效

注意:安装软件机器名最好不要用localhost,可能会有问题
mysql单实例与多实例?

mysql帮助:
mysql>help show
mysql>show databases like '%oldboy%';  模糊查找
\h
mysql>help grant  授权命令
mysql>help revoke  取消授权 
学会使用help

设置修改mysql root密码:
安装mysql后默认的管理员root密码为空,修改密码
mysqladmin -uroot passord '123456'
1.有初始密码后修改密码需:
mysqladmin -uroot -p'123456' password '654321'

2.登录进去之后再修改user表:
mysql>use mysql; 进入mysql库
mysql>desc user; 查看user表结构
mysql>select user,host,password from user;  查看帐号相关的三个字段信息。
mysql>UPDATE mysql.user SET password=PASSWORD("654321") where user='root';
mysql>flush privileges;   刷新mysql的系统权限相关表,相当于reload重新加载
3.mysql安装后,root默认密码为空,需马上修改root口令
mysql>set password=password('123456');

找回丢失的mysql密码:
单实例:
killall mysqld
mysqld_safe --skip-grant-table &      忽略授权表的方式启动
mysql -uroot -p
mysql>update mysql.user set password=PASSWORD('123456') where user='root';修改密码 
mysql>flush privileges;更改完再重启mysql服务登陆测试.

===========================================================
数据库操作部分
1.创建删除库
show databases;
create database test_db;
create database test_db2 default character set gbk collate gbk_chinese_ci; 创建并指定gbk的字符集
create database test_db3 character set utf8 collate utf8_general_ci;   utf8字符集的库
show create database test_db; 查看创建的库
show databases like '%test%';
drop databases test_db;

学会使用help
help create;


use test_db;
select database();  查看当前连接的数据库
select version();   查看版本
select user();      查看当前用户
help select;

删除系统多余帐号:
select user.host from mysql.user;
drop user 'root'@'localhost'
drop user ''@'localhost'  删除空用户

创建用户并授权:
help grant;
grant all privileges on dbname.* to username@localhost identified by 'passwd';
show grants for username@localhost;
grant ALL on test_db.* to test@localhost identified by '123';
revoke select on *.* from 'test'@localhost; 取消select权限
show grants for test@localhost; 查看test用户所拥有的权限
----
mysql  all privileges(最大权限):
select,insert,update,delete,create,drop,reload,shutdown.....
----
生产环境中主库用户的授权:
grant select,create,update,insert,delete on blog.* to 'bloguser'@'10.0.0.%' identified by '123456';
生产环境中从库用户的授权:
grant select blog.* to 'bloguser'@'10.0.0.%' identified by '123456';

创建表:
create table test{
id int(4) not null primary key auto_increment,
name char(20) not null
};

生产环境标准的utf8格式表结构语句
1.mysql常用字段类型
tinyint[(M)]
int[(M)]
char[(M)]
varchar[(M)]
text
LONGTEXT
date
DATETIME
TIMESTAMP[(M)]

2.建立几张关联表
create table student(
Sno int(10) NOT NULL COMMENT '学号',
Sname varchar(16) NOT NULL COMMENT '姓名',
Ssex char(2) NOT NULL COMMNET '性别',
Sage tinyint(2) NOT NULL default '0' COMMENT '学生年龄',
Sdept varchar(16) default NULL COMMENT '学生所在系别',
PRIMARY KEY (Sno)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
常用引擎innodb和myisam的区别?默认引擎是myisam

show columns from student;  等同于desc student 查看表结构
show create table student \G

插入数据
insert into <表名> [(<字段名1>......] values (值1)
eg.
insert into student(id,name) values(1,'zhaoye');   <==按规矩每列都插入值 
insert into student(name) values('zhangsan');      <==id列为自增,所以可以只在name列插入值
 
备份:
mysql>system mysqldump -uroot -p'123456' -A -B >/tmp/sqlbak.sql
mysql>system ls -l /tmp/sqlbak.sql
提示:system为跳出mysql执行系统命令,执行完毕返回mysql.

查询:
select<字段1,字段2,...> from<表名> where <表达式>
select * from test;
select * from test limit 2;
select * from test where id=5;   或where name='zhangsan'

修改
update 表名 set 字段=新值 ,where 条件 
update test set name='wangs' where id=1;

删除
delete from test where id=1;

清空表中内容
truncate table 表名;

表中增加字段
alter table test add sex char(4);
alter table test add age int(2) after name;

更改表名
rename table oldtable to newtable;
help rename table;
alter table oldtable rename to newtable

删除表
drop table xx;

mysql字段类型:
int
char
.......

========================================================

mysql备份与恢复
备份:
mysql>system mysqldump -uroot -p'123456' -A -B >/tmp/mysqlbak.sql      
$MYSQL_PATH/mysqldump -u$MYUSER -p$MYPASS -S $MYSOCK -A  -B --flush-logs --single-transaction |gzip >sqlbak_(date +%F).sql.gz 备份所有库
--single-transaction保持数据一致性,热备:这里因为使用的是InnoDB引擎,就不必进行对数据库加锁的操作,加一个选项既可以进行热备份:--single-transaction
如果是myisam表则需加参数:--lock-all-tables

mysqldump --databases mydb --single-transaction  --flush-logs --master-data=2 > /tmp/backup-`date +%F-%H-%M`.sql


恢复:
gzip sqlbak_(date +%F).sql.gz
mysql -S $MYSOCK <sqlbak_(date +%F)
system mysql -uroot -p'123456'  student</tmp/mysqlbak.sql   恢复单个库
select * from student;
-----------------------
mysqldump备份单个库
普通备份
mysqldump -uroot -p'123456' student>/tmp/student.sql
压缩备份
mysqldump -uroot -p'123456' student|gzip>/tmp/student.sql.gz
设置字符集进行备份
mysqldump -uroot -p '123456' sutdent --default-character-set=gbk |gzip>/tmp/student-gbk.sql.gz
more直接查看sql备份内容

备份多个库
mysqldump --help
-B 库名... 参数,用于导出若干个库,当数据库列全时,同-A参数
mysql -uroot -p'123456' -e "show databases;"
mysqldump -uroot -p'123456' -B student student2 --default-character-set=gbk>/tmp/stu.sql
--------------------------
备份单/多个表
mysqldump -uroot -p'123456' student test --default-character-set=gbk>/tmp/stu-single-table.sql  student库下的test表
mysqldump -uroot -p'123456' student test test2 test3 ..........  备份多个表
-------------------------
备份数据库结构
mysqldump -uroot -p'123456' -d student test>/tmp/stu-table-desc.sql

*****************************************************************************
恢复数据库
1.单个表的恢复
mysql>use student;
mysql>source /tmp/stu-single-table.sql

2.用mysql命令恢复数据库
mysql -uroot -p'123456' -e "use student;set names gbk;select * from test;"
mysql -uroot -p'123456' student</tmp/stu.sql
********************************************************************************

填充中文数据解决乱码问题:
insert into test(name) values("冰茄子");
1)mysql>set names gbk; 如果乱码更改字符集(更改客户端,连接,返回结果的字符集全改成了GBK)
mysql>show variables like 'character_set%';   默认都是latinl拉丁字符集
2)或在my.cnf中加入参数
[mysqld]
default-character-set=gbk
3)登录时加入参数
mysql -uroot -p'123456' --default-character-set=gbk -e "select * from student.test"
-e非交互式的命令实现

mysql -uroot -p'123456' -e "truncate table student.test"清除表中内容
mysql -uroot -p'123456' -e "show global status;" |head -5 查看sql状态

oldboy博客:
mysql生产环境案例
mysql数据库批量插入数据shell脚本实现
不登录执行mysql命令小结

======================================
mysql多实例
一台机器上开启多个不同的服务端口如3306,3307,不同的socket监听不同的服务端口来提供各自的服务,逻辑上多实例是各自独立的。
使用不同的my.cnf配置文件.

特点:
有效利用服务器资源,节约资源,适合并发访问不是特别大的业务,
如3台服务器上部署6-9个实例,交叉做主从同步备份及读写分离。需合理分配好系统资源。

mysql多实例的常见配置方法
1.放在单一配置文件中部署
2.每个实例分别放在不同的配置文件中(推荐,配置文件和启动文件分离)。
1)多实例数据目录的创建:
mkdir -p /data/{3306,3307}/data
tree /data
2)多实例配置文件的创建
配置文件详细参数总结???
/data/3306(3307)/my.cnf
参见视频文档
多实例启动脚本???
3)数据库目录权限mysql.mysql
4)配置mysql命令全局路径
5)初始化mysql多实例数据文件
mysql_install_db -data_dir=/data/3306/data --user=mysql
MYD MYI frm
6)mysql多实例的启动
rc.local配置开机自启动
/data/3306/mysql start(启动脚本)

多实例的登录:
mysql -S /data/3306/mysql.sock    指定socket文件
mysql -uroot -p -S /data/3306/mysql.sock

增加一个mysql实例的过程:
mkdir -p /data/3308/data
cp /data/3308/my.cnf /data/3308
cp /data/3308/mysql  /data/3308
chown -R mysql.mysql /data/3308
chmod 700 /data/3308/mysql
mysql_install_db --datadir=/data/3308/data --user=mysql 如不指定mysql用户,默认以root用户创建初始化生成的文件,启动时会出错
chown -R mysql.mysql /data/3308
修改配置文件
/data/3308/mysql start
注:my.cnf中配置错误日志方便调试.


从库同步出错:

  1. mysql>stop slave;  
  2. mysql>reset slave;  
  3. mysql> CHANGE MASTER TO  
  4.     ->   MASTER_HOST='192.168.7.19',  
  5.     ->   MASTER_USER='sqlsync',  
  6.     ->   MASTER_PASSWORD='123456',  
  7.     ->   MASTER_PORT=3306,  
  8.     ->   MASTER_LOG_FILE='log.000003',  
  9.     ->   MASTER_LOG_POS=61139130,  
  10.     ->   MASTER_CONNECT_RETRY=60;  
  11. Query OK, 0 rows affected (0.08 sec)  
  12.  
  13. mysql> start slave;  
  14. Query OK, 0 rows affected (0.00 sec)  
  15.  
  16. mysql> show slave status\G;  
  17. *************************** 1. row ***************************  
  18.              Slave_IO_State: Queueing master event to the relay log  
  19.                 Master_Host: 192.168.7.19  
  20.                 Master_User: sqlsync  
  21.                 Master_Port: 3306  
  22.               Connect_Retry: 60  
  23.             Master_Log_File: log.000028  
  24.         Read_Master_Log_Pos: 4  
  25.              Relay_Log_File: mysqld-relay-bin.000002  
  26.               Relay_Log_Pos: 229  
  27.       Relay_Master_Log_File: log.000003  
  28.            Slave_IO_Running: Yes  
  29.           Slave_SQL_Running: No  
  30.             Replicate_Do_DB:   
  31.         Replicate_Ignore_DB:   
  32.          Replicate_Do_Table:   
  33.      Replicate_Ignore_Table:   
  34.     Replicate_Wild_Do_Table:   
  35. Replicate_Wild_Ignore_Table:   
  36.                  Last_Errno: 1062  
  37.                  Last_Error: Error 'Duplicate entry '197963' for key 1' on query. Default database: 'agrocms'. Query: 'INSERT INTO agrocms.web_swgkbdxx (web_id,town_code,name,area,bdxx,swgk,bdxxsum,swgksum,day) values ('116597','330522105212','xx村','浙江/湖州/xx县/xx镇/xx村',0,0,0,17,'2013-03-14')'  
  38.                Skip_Counter: 0  
  39.         Exec_Master_Log_Pos: 61139130  
  40.             Relay_Log_Space: 5383075  
  41.             Until_Condition: None  
  42.              Until_Log_File:   
  43.               Until_Log_Pos: 0  
  44.          Master_SSL_Allowed: No  
  45.          Master_SSL_CA_File:   
  46.          Master_SSL_CA_Path:   
  47.             Master_SSL_Cert:   
  48.           Master_SSL_Cipher:   
  49.              Master_SSL_Key:   
  50.       Seconds_Behind_Master: NULL  
  51. 1 row in set (0.25 sec)  
  52.  
  53. ERROR:   
  54. No query specified  
  55.  
  56. mysql> INSERT INTO cms.web_bdxx (web_id,town_code,name,area,bdxx,swgk,bdxxsum,swgksum,day) values ('116597','330522105212','xx村','浙江/湖州/xx县/xx镇/xx村',0,0,0,17,'2013-03-14');  
  57. ERROR 1062 (23000): Duplicate entry '116597-2013-03-14' for key 2 重复插入 

解决方法:
mysql>set global sql_slave_skip_counter=1;不行,因为后面很多重复的insert语句执行不了同样的提示错误
只好将slave-skip-errors=1062加入到my.cnf中 跳过错误代码为1062(重复更新)的所有语句

===================================================
LVM的快照功能进行备份

为了安全 首先在数据库上施加读锁
mysql>FLUSH TABLES WITH READ LOCK;

刷新一下二进制日志,便于做时间点恢复
mysql>FLUSH LOGS;

然后创建快照卷
lvcreate –L 1G –s –n data-snap –p –r /dev/myvg/mydata

最后进入数据库释放读锁
UNLOCK TABLES;

挂载快照卷进行备份
mount –r /dev/myvg/data-snap /mnt/snap

然后对/mnt/snap下的文件进行打包备份
还原的时候,关闭mysqld,然后备份二进制日志后将原来备份的文件还原进去,然后通过二进制日志还原到出错的时间点(通过二进制还原时间点的时候不要忘了暂时关闭二进制日志)