MYSQL配置:数据库结构:库.表.记录 一、登录及退出 mysql -u root exit 加密码: mysqladmin -u root password 123456 mysql -u root -p 改密码: mysqladmin -u root -p password 666666 二、查看 查看数据库 show databases; 切换数据库命令 use test; 查看表: show tables; 查看表结构 desc user; 三、创建与删除 库操作 create database stu; drop database stu; 表操作 create table user( name char(8) not null, age tinyint not null, xb char(3) not null, password char(16) not null default '123456', id char(18) not null, primary key (id)); drop table user; 四、记录操作命令 查: select * from user; select * from user where name='xc'; 增: insert into user values( 'xc','17','w','000000','01' ); insert into user(name) values( 'xh'); 改: update user set xb='m' where name='xh'; update user set password=encrypt('111111') where name='xh'; 删: delete from user where name='xh'; 授权: grant all on stu.user to wcg@localhost identified by '111111'; 删除权限: revoke all on stu.user from wcg@localhost; 查看权限: show grants for wcg@localhost; 五、备份与还原 备份 mysqldump -u root -p stu>/opt/stu.bak mysqldump -u root -p --all-databases>/opt/all.bak mysqldump -u aaas -p yxbao_website>/mydir/aaa.sql 备份 还原 mysql -u root -p stu</opt/stu.bak mysql -u root -p </opt/all.bak mysql -u aaas -p qbxb_website<aaa.sql 还原 ------------------------------------------------------------ --------《数据操作》------ use mysql; 切换数据库 select user,host,password from mysql.user; 查看数据 drop user ''@'localhost'; 删除空用户 update mysql.user set host='192.168.200.%' where user='root' and host='127.0.0.1'; 刷新 update user set password=password('123456') where user='root'; 刷新改密码 flush privileges; 刷新MySQL的系统权限相关表 在当前用户的家里面: (局部需要手动输入密码) vim .my.cnf [client] user=root password=123456 host=localhost show engines; 查看引擎 Transactions: 事物的意思 XA: 分布式事物 Savepoints: 存储点 MyISAM 适用于写少读多的场景 适合做查询,适合数据仓库 InnoDB 适用于读多写多,支持事物 修0改数据库默认引擎: vim /etc/my.cnf #default-storage-engine=MYISAM default-storage-engine=INNODB MYISAM 写少读多 应用于电子图书馆 (表级别) .frm :表结构 .myd :表数据 .myi :表索引 Innodb 读多写多 应用于电子商城以及各种应用 (表级别) .frm :表结构 .ibd :表空间(数据和索引) .opt :字符集和排序规则 innodb_file_per_table=1 每个表都有一个表空间 show table status like 'user' G 查看表状态 可以查看一个表的存储引擎是什么 变量: 服务器变量: show global variables; (查看全局变量) show global variables like '%innodb'; 状态变量: show global status; select database (); 查看当前正在实用的哪个库 -------------------------- mysql -u root -p123456 -e 'create database c17' -e 参数,在shell命令中直接操作(调用)mysql 命令 mysql -u root -p123456 -D c17 -e 'create table user(id char(16) not null)' -D 参数,在shell环境中直接登录到指定的库 ----------------------------------------------------------------- create database c15 default character set utf8; (创建库的时候加一个默认字符集,就是实现往里面差中文了) default-character-set=utf8 设置默认字符 通过mysql命令修改: 修改数据库的字符集 mysql>use mydb mysql>alter database mydb character set `utf8` collate `utf8_general_ci`; show 创建数据库指定数据库的字符集 mysql>create database mydb character set `utf8` collate `utf8_general_ci`; mysql>create database mydb character set `gbk` collate `gbk_chinese_ci`; 通过配置文件修改: 修改/var/lib/mysql/mydb/db.opt default-character-set=latin1 default-collation=latin1_swedish_ci 为 default-character-set=utf8 default-collation=utf8_general_ci 重起MySQL: show character set; 字符集查看 show collation; 查看排序规则 cd /usr/local/mysql/data/mydb vim db.opt (查看修改的字符集) ------------------------------------------------------- 1.通过MySQL命令行修改默认字符集: mysql> set character_set_client=utf8; mysql> set character_set_connection=utf8; mysql> set character_set_database=utf8; mysql> set character_set_results=utf8; mysql> set character_set_server=utf8; mysql> set character_set_system=utf8; mysql> set collation_connection=utf8; mysql> set collation_database=utf8; mysql> set collation_server=utf8; 查看: mysql> show variables like 'character_set_%'; show variables like 'collation_%'; 另一台服务器导入已有数据库: 本台服务器yum安装 vim /etc/my.cnf default-character-set=utf8 default-collation=utf8_general_ci [client] default-character-set=utf8 -------------------《表操做》------------------ 一、键与索引 1、主键:唯一,非空,只有一个 唯一键:唯一,可以为空,多个 2、索引: show indexes from user;(查看) (表名)(字段名) create index kc_index on kecheng(kc); (创建) (自定义索引名) drop index kc_index on kecheng; (删除) 二、创建、删除、修改 1、创建 create table user(id int unsigned not null auto_increment,name varchar(30) not null,age tinyint not null,primary key(id),unique key(name),index(age)); (unsigned 正整数) (unique 唯一键 ) (index 索引) auto_increment(自动编号功能) (整数类型,无符号(正数)、非空、主键或唯一键) select_insert_id0; (最后一个插入id号) show table status like 'user' G; (查看表状态) create table kecheng(kcid tinyint unsigned not null auto_increment primary key,kc varchar(50) not null) engine=innodb; create table u1 select * from user whwere id<=2; (导入数据一样,表结构不一样) create table u2 like user; (导入表结构一样数据不一样) 2、修改 增加、修改、删除字段 alter table user add kcid tinyint unsigned not null; alter table user change kcid kid tinyint unsigned not null; 增加、修改、删除索引 alter table user add indx kcid(kcid); alter table user drop kcid; (删除) 修改表名字 alter u1 rename to nu ll; 修改表引擎 alter table user engine=innodb; ------------------------------------------------------------ mysql环境导入数据库 ! mysql -uroot c15</root/c15.sql -------------------------------------------------------- 单表查询(简单查询) select * from c15.gangwei; select name,gongzi from c15.gangwei; select * from c15.gangwei where name='王力邦'; select distinct gangwei from c15.gangwei; (去除重复的,返回唯一不同值) select name as '姓名',gongzi as '工资' from gangwei where gongzi>5000; ------布尔表达式: = Equal to (等于) <> aka != Not equal (不等于) <=> NULL,safe equal to (等于空) < Less than (不到) <= Less than or equal to(小于或等于) > Greater than (大于) >= Greater than or equal to (大于或等于) --------逻辑表达式: Not aka ! Logical NOT 逻辑不 AND aka && Logical AND 逻辑和 OR aka || logical OR 逻辑或 例子: select * from gangwei where gangwei='运维' or gangwei='售前'; select * from gangwei where gangwei !='运维'; -------扩展表达式: BETWEEN Exists in specified range (存在于指定范围) IN Exists in specified set (存在于指定的组) IS NULL Is a NULL value (是一个空值) IS not null Is not a NULL value (不是一个NULL值) LIKE Wildcard nmath (通配符nmath) 例子: select * from gangwei where test3 between 15 and 30; select * from c15.gangwei where gangwei in ('运维','坐家'); select * form gangwei where gangwei is not null; ------------------------ #order by 子句: select * from user where gangwei is not null order by gongzi desc; asc 升序 desc 降序 #limit 子句: select name as '姓名',gongzi as '工资' from gangwei where gongzi>500 limit 5,5; (limit 5,5 显示去掉前5个,从第六行显示5行) select * from info order by id desc limit 1; (显示最后插入的) #聚合: avg(平均值) sum(总和) min(最小) max(最大) count(数) select avg(test1) as '平均工资' from gamgwei; select sum(test1) as '总分' from gangwei; select min(test3) as '总分' from gangwei; select max(test3) as '总分' from gangwei; #分组 select avg(test1) as '平均分',gangwei as '岗位' from user group by gangwei; select avg(test1) as '平均分',gangwei as '岗位' from user group by gangwei having avg(test1)>5; select avg(gongzi) as '平均工资', gangwei as '岗位' from user group by gangwei; select avg(gongzi) as '平均工资', gangwei as '岗位' from user group by gangwei having avg(gongzi)>3000; having (有的意思) 好比过滤一下的意思 ---------------------增、删、查-------------------------- 查询: 1、创建单表导入另一个表(简单查询) create table info select * from gangwei; create table info2 like gangwei; 2、多表查询 自然连接: select g.name,g.gangwei,i.class,i.age from gangwei as g,info as i where g.name=i.name; 外连接: 左外连接 select g.id,g.name,g.gangwei,i.class,i.age from gangwei as g left join info as i on g.name=i.name; 右外连接 select g.gangwei,i.id,i.name,i.class,i.age from gangwei as g right join info as i on g.name=i.name; 3、子查询(嵌套查询) select * from info where age>(select avg(age) from info); select * from info where name in (select name from gangwei); 4、联合查询 (select name,gongzi from gangwei)union(select name,.age from info) 增删改: select last_insert_id(); create table infobak like info; (把另一张表的数据你导入新建的一张表里) insert into infobak(name,class,age,xulei) select nmae,class,age,xulei from info where age>=20; truncate table info; (不能加条件,初始化表的意思) ------------------------------------------------------------------------------------------------------------------------------------- 《用户权限管理》 一、用户管理: 1、创建 create user bbsroot@'%' identified by '123456'; select user,host,password from mysql.user; (查看) flush privileges; (刷新授权表) 2、删除 drop user bbsadmin@localhost 3、修改 rename user bbsroot@'%' to bsadmin@localhost; select user(); (查看当前登录用户) update user set password=password('formal') where user='yxjr123456@A'; 刷新改密码 二、权限管理 1、权限级别 user: 用户账号、全局权限 host: 合并到user表 db: 数据库权限 tables_priv: 表权限 columns_priv: 字段权限 procs_priv: 存储过程、存储函数权限 use mysql; desc user; (查看) 2、权限的种类 是一张表 3、授权 create user aaas@'%' identified by 'yxjr123456@'; grant all on *.* to aaas@'%'; show grants for root@localhost; grant update(class) on c15.info to wcg@localhost; grant all on *.* to formal@'%' identified by 'yxjr123456@RAK'; 4、撤销权限 revoke all on *.* from wcg@localhost; 5、破解密码 vim /etc/init.d/mysql $exec 这下面加 --basedir=/usr --user=mysql --skip-grant-table>/dev/null 2>&1 & --skip-network (跳过远程登录) --skip-name-resolve (屏蔽名字解析,加快用户登录速度) ---------------------------------------------------------------PS PS是LINUX下最常用的也是非常强大的进程查看命令 //以下这条命令是检查java 进程是否存在. ps -ef |grep java 下面对命令选项进行说明: -e 显示所有进程。 -f 全格式。 ps e 列出程序时,显示每个程序所使用的环境变量。 ps f 用ASCII字符显示树状结构,表达程序间的相互关系 grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 ps -ef | grep httpd : 检查httpd进程是否存在 ------------------------《日志管理》----------------------------- show global variables like '%log%'; 一、错误日志 1、记录mysql启动、停止过程 2、同步过程 /var/log/mysqld.log 目录位置 一台繁忙的mysql服务器,如果开启日志功能会产生大量的I/O,严重影响mysql的性能,把日志和数据分别存放在(不存放在一个硬盘中) 可以更改目录位置 vim /etc/my.cnf log-error=/var/log/mysqld.log -----二、一般日志------ 默认关闭, 推荐关闭 general_log |OFF general_log_file |/var/run/mysqld/mysqld.log -----三、慢查询日志----- slow-query-log mysql.cnf 里面加一条就开启了 long_query_time |10.000000 十秒以外的就是慢性查询了 slow_query_log |OFF 默认是关闭的 slow_query_log_file |/var/run/mysqld/mysql-slow.log (/usr/local/mysql/data/localhost-slow.log二进制安装目录) vim /etc/my.cnf 开启 slow-query-log log-slow-queries = /var/lib/mysql/mysql-slow.log long_query_time = 2 超过多少秒 -----四、二进制日志文件------ 1、做数据库主从复制 2、即时点还原,可以把数据还原到数据崩溃的那一刻 1、开启 vim /etc/my.cnf (开启二进制日志) log-bin=mysql-bin 1) log-bin-index=/var/run/mysqld/mysql-bin.index 生成目录有哪些二进制文件 2) log-bin=/var/run/mysqld/mysql-bin (实际工作中这个这个目录应该是一个挂载点,因为在不同硬盘上比较安全)(更改这个目录的时候必须改 属主数组) 3)sync-binlog=1 同步二进制文件,每隔多长时间、每隔多少事件往硬盘里写一次 2、格式 binlog_format statement 保存命令,能够引起数据库变化的 row 保存的变化行 mixed 混合格式 vim /etc/my.cnf binlog_format=mixed 3、查看 show master status; 当前正在使用哪个二进制文件 show binlog events in 'mysql-bin.000002'; 当前二进制文件哪些事件 cd /usr/local/mysql/data mysqlbinlog mysql-bin.000003 查看 mysqlbinlog --start-position=106 --stop-position=187 mysql-bin=000002>/opt/info.bak 导出来 mysqlbinlog -hlocalhost -uroot -p mysql-bin.000001>1.sql 导出来保存sql格式恢复 106 前叫 二进制文件头 at 106 开头 end 187 结束 show binary logs; 查看所有二进制文件 mysqlbinlog mysql-bin.000003 查看 4、滚动 service mysqld restart flush logs; 5、删除 show binary logs; purge binary logs to 'mysql-bin.000003' 删除000003 以前的 --------五、《事务》----------------------------- INNODB特征: 多用户,多程序,多线程,并发 ACID就是:原子性(Atomicity)、一致性(Consistency)、 隔离性(Isolation)、持久性(Durabilily) show tables status G; (查看表状态) show global variables like '%auto%'; 查看一下自动提交 set autocommeit=0; (关闭自动提交) start transaction; 启动事务日志(操作数据库之前必须做) 启动日志以后所有操作将会被记录下来 delete from info where id=18; (假如误操作删了表里面的东西) rollback; 回滚 (可以回复误操作删除的东西) commit; 提交 (提交以后的才是保存的,做完操作必须做) savepoint full; 保存当前表完全数据 savepoint no16; 保存前16数据,精确值 savepoint no17; rollback full; 恢复完全数据的 rollback no16; 恢复精确的 show global variables like '%log%'; 查看一下事务日志的目录 事务日志和数据日志在同一个目录下 cd /avr/lib/mysql ib_logfile0 ib_logfile1 里面为什么有两个文件呢,因为第一个写满了第二个接替第一个工作,第二个写满了第一个接替第二个工作,循环工作,防止出现工作停顿。 --------------------六、事务日志------------------------------ innodb_flush_log_at_trx_commit 0: 每秒同步,并执行磁盘flush操作; 1:每十五同步,并执行磁盘flush操作; 2:每事务日志,但不执行磁盘flush操作; 工作中用 1 ===================================================================== 《备份与恢复》 一、备份类型: 热备:在数据库正在运行情况下进行备份。 温备:服务正在运行,可读不可写时备份。 冷备:在数据库停止的情况下进行备份。 物理备份:直接把数据文件拷贝出去 逻辑备份:mysqldump 逻辑备份。备份文件是语句是逻辑备份。 完全备份:一次完整备份 列如all 增量备份:不包含上一次备份的数据,只备份增加的一部分 优点:备份数据量小备份速度快。占用空间小 缺点:还原速度慢 得一个一个的还原,还原慢。而且很麻烦 差异备份:包含上一次备份的数据 优点:备份数据多,速度比较慢。占用空间大。 缺点:还原效率高。 二、 备份内容:数据文件,配置文件,二进制日志,事务日志。 备份工具: ======mysqldump :==== flush tables with read lock; 把表变成只读表,防止备份出来的数据不一致 unlock tables; 解除读锁 flush logs; 滚动日志(二进制) man mysqldump: --lock-all-tables 如果指定库中的表类型均为INNODB,可使用 --single-transaction启动热备,不要和--lock-all-tables 一起使用 --flush-logs --master-data={0|1|2} 0:不记录二进制日志文件及路位置; 1:以CHNAGE MASTER TO 的方式记录位置,可用与恢复后直接启动从服务器; 2:以CHANGE MASTER TO 的方式记录位置,默认为被注释; 备份 mysqldump -u root -p --lock-all-tables --flush-logs --master-data=2 --events --all-databases>/opt/all-`date +%F-%H-%M-%S`.sql 还原 mysql -uroot -p </opt/all-all-2015-05-20-11-14-03.sql flush-logs; show binary logs; show binlog events in 'mysql-bin.000002'; (查看所需要还原的事件) 二进制日志备份 备份 mysqlbinlog --start-position 120 --stop-position 907 mysql-bin.000009>/opt/9.sql 还原 mysql -uroot -p</opt/binlog-bak-2015-05-20-11--31.sql 还原时关闭二进制日志,完成后开启 缺点: 1、可能会引起浮点数据丢失精度; 2、备份数据容量大于原始数据(压缩后大大节省空间) 3、速度慢,不适合对大数据库做完全备份; -------《第二种备份方法》 select * into outfile '/opt/back15' from info; 通常适用于备份一张表 create table info1 like info; load data infile '/opt/back15' into table info1; ---------《LVM 逻辑卷备份》 pvcreate /dev/sdb /dev/sdc vgcreate vg0 /dev/sdb /dev/sdc lvcreate -L 500M -n lv0 vg0 mkfs -t ext4 /dev/vg0/lv0 mkdir /mnt/mysqldata 挂载 mount -a vim /etc/my.cfg [mysqld] datadir=/mnt/mysqldata (更改一下位置) log-bin=mysql-bin service mysqld restart chown -R mysql.mysql /mnt/mysqldata 1、数据文件要在逻辑卷上; 2、此逻辑卷所在卷组必须有足够空间使用快照卷; 3、数据文件和事务日志要在同一个逻辑卷上; 1、打开会话,施加读锁,锁定所有表; flush tables with read lock; flush logs; show master status; (查看当前二进制的位置) 2、通过另一个终端,保存二进制日志文件及相关位置信息; mysql -uroot -p -e 'show master status G'>/path/to/master.info; 例:mysql -uroot -p -e 'show master status G'>/opt/binlog.info 3,创建快照 lvcreate -L# -s -p r -n LV_NAME /path/to/source_lv 例:lvcreate -L 50M -s -p r -n lv0-back /dev/vg0/lv0 (-s snapshop 快照卷的意思) (-p 权限)(-r读 -w写) 4、释放锁 unlock tables; 5、挂载快照卷 备份 mkdir /mnt/lv0-bak mount /dev/vg0/lv0-bak /mnt/lv0-bak 备份 cp -ra * /opt/bakc15 ( -a 保留原有文件属性) 6、删除快照卷 unmont /mnt/lv0-bak lvremove /dev/vg0/lv0-bak 7、增量备份二进制 insert into info(age) values(110); (增加一个备份没有的) 备份二进制 mysqlbinlog mysql-bin.000002>/opt/2.sql 关闭二进制文件 删除然后还原 service mysqld restart 8、还原 cd /opt/bakc15 cp -ra * /mnt/mysqldata mysql<2.sql (二进制还原) ------------------------------------------------------------------ XTRAbackup 完整备份 innobackupex --user=root /opt 备份到哪里 进入的opt下备份的目录 cat xtrabackup_binlog_info (二进制日志保存的位置) mysqlbinlog mysql-bin.000004 (保存位置那个日志) innobackupex --apply-log /opt/2015-05-24_15-28.11 敲完上面的这一条必须敲,完善上面配置的 mysqlbilog --start-position=106 mysql-bin.000004>/opt/bakbinlog (备份二进制文件) (恢复) innobackupex --copy-back /opt/2015-05-24_15-28-11 chown -R mysql.mysql * (恢复之后属=主数组权限更改为原来的mysql) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- lower_case_table_names=1 (不区分大小写) <<MySQL查看和修改wait_timeout>> 1、全局查看wait_timeout值 [plain] view plaincopyprint? mysql> show global variables like 'wait_timeout'; 2、修改全局wait_timeout值 [plain] view plaincopyprint? set global wait_timeout=28800; 或 修改 /etc/mysql/my.cnf 添加 wait_timeout= 432000 默认值是28800秒(即默认8小时),修改为432000 单位为毫秒; 3、查看修改之后的值 ----------------------------------------------------------------------------------------- 设置新的MySQL最大连接数为200: MySQL> set GLOBAL max_connections=200; 或 vim /etc/my.cnf max_connections=1500; 《如何查看mysql数据库连接数和内存占用》 命令: show processlist; 或 mysqladmin -uadmin -p -h10.140.1.1 processlist 如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。 show processlist;只列出前100条,如果想全列出请使用show full processlist; mysql> show processlist; 命令: show status; 命令:show status like '%下面变量%'; Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 Connections 试图连接MySQL服务器的次数。 Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 Delayed_writes 用INSERT DELAYED写入的行数。 Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 Flush_commands 执行FLUSH命令的次数。 Handler_delete 请求从一张表中删除行的次数。 Handler_read_first 请求读入表中第一行的次数。 Handler_read_key 请求数字基于键读行。 Handler_read_next 请求读入基于一个键的一行的次数。 Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 Handler_update 请求更新表中一行的次数。 Handler_write 请求向表中插入一行的次数。 Key_blocks_used 用于关键字缓存的块的数量。 Key_read_requests 请求从缓存读入一个键值的次数。 Key_reads 从磁盘物理读入一个键值的次数。 Key_write_requests 请求将一个关键字块写入缓存次数。 Key_writes 将一个键值块物理写入磁盘的次数。 Max_used_connections 同时使用的连接的最大数目。 Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。 Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 Open_tables 打开表的数量。 Open_files 打开文件的数量。 Open_streams 打开流的数量(主要用于日志记载) Opened_tables 已经打开的表的数量。 Questions 发往服务器的查询的数量。 Slow_queries 要花超过long_query_time时间的查询数量。 Threads_connected 当前打开的连接的数量。 Threads_running 不在睡眠的线程数量。 Uptime 服务器工作了多少秒 --------------------------------------------------------------------------------------- log_bin_trust_function_creators=true 解决(mysql)包查询太大 说明: 1、项目刚开始运行时是正常的,可以正常访问,可是运行了一段时间就报错 2、查询下设置最大值 SHOW VARIABLES LIKE '%max_allowed_packet%'; 3、修改vim /etc/my.cnf max_allowed_packe=16384 应用: truncate table 表名; 恢复id值从1开始