Mysql作为开源数据库的中坚力量之一,虽然目前已被甲骨文收购,面临闭源风险,但是mysql扔是我们运维工作中最常面对的工作,那如何做好mysql运维工作,甚至做好mysql的基础运维,都是维稳业务持久层的关键,故本文收集相关资料整理MySQL运维工作常用的命令,以作记录,供日常运维时参考查证。

二、Mysql运维

MySQL运维工作常用命令和操作主要包括:对MySQL数据库状态的查看、性能的优化(连接数,存储,集群等),MySQL表及索引的检查、分析、修复、优化,MySQL数据库的导出导入、冷热备份等。

2.1、工具篇

常用工具:
在这里插入图片描述
1)myisampack:压缩MySQL的MyISAM表以产生更小的只读表的一个工具。myisampack可以压缩MyISAM表来解决空间占用过大的问题。myisampack分别压缩表中的每一列。通常,myisampack可以将数据文件压缩到40%-70%。当以后使用表时,解压缩列需要的信息被读入内存。当访问具体的记录时性能会更好,因为你只需要解压缩一个记录。

2)mysqlaccess:检查访问主机名、用户名和数据库组合的权限的脚本。它可作为MySQL的一个诊断工具,检查访问权限的主机名、用户名和数据库组合。其检查功能只访问user、db和host这3个表,而不检查在tables_priv、columns_priv或procs_priv表等信息;

3)mysqladmin:用于管理MySQL服务器的客户端。它是执行管理操作的客户端程序,可以用它来创建或删除数据库,重载授权表,将表刷新到硬盘上,以及重新打开日志文件,检索版本、进程,以及服务器的状态信息;

4)mysqlbinlog:从二进制日志读取执行过的语句的工具。MySQL数据库服务器生成的所有更新了的数据或者已经潜在更新了的数据的----所有语句----均以二进制日志文件存在,文件内容是由很多event group组成的,每个group中包含一组event,其中又分事务性和非事务性,对应不同的event,每一条信息都是一条event,语句以“事件”的形式保存,它描述数据更改。要想检查这些文本格式的文件,应必须使用mysqlbinlog工具,可通过这些二进制日志帮助MySQL数据库从崩溃中恢复。

5)mysqlcheck:检查、修复、分析以及优化表的表维护客户端程序。其主要用来检查和修复MyISAM表,mysqlcheck还可以优化和分析表。mysqlcheck的功能类似myisamchk,但其工作不同。mysqlcheck和myisamchk主要差别是** 当mysqld服务器在运行时必须使用mysqlcheck **,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表,mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。

6)mysqldump:将MySQL数据库转储到一个文件(例如SQL语句或tab分隔符文本文件)的客户端程序。可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器)。转储包含创建表和/或装载表的SQL语句。如果你在服务器上进行备份,并且表均为MyISAM表,应考虑使用mysqlhotcopy,因为可以更快地进行备份和恢复。

7)mysqlhotcopy:当MySQL数据服务器在运行时,快速备份MyISAM或ISAM表的工具。mysqlhotcopy实际其是一个Perl脚本,它使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库。它是 备份数据库或单个表的最快 的途径,但它只能运行在数据库目录所在的机器上。mysqlhotcopy只用于备份MyISAM且运行在Unix和NetWare中。

8)mysqlimport:使用LOAD DATA INFILE将文本文件导入相关表的客户端程序。该程序r位于mysql/bin目录中,它是一个非常有效的数据导入工具。mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。这个命令可以让我们很轻松的把有结果规律的文本导入到MySQL数据库中。

9)mysqlshow:显示数据库、表、列以及索引相关信息的客户端程序。它可用来很快地查找存在哪些数据库,数据库中的表,表中的列或索引。mysqlshow为一些SQL显示语句提供了一个命令行界面,相同的信息可以通过直接使用那些语句获得。

10)myisamchk:MyISAM表维护实用工具。它可用来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。myisamchk的功能类似mysqlcheck,但其工作不同。myisamchk和mysqlcheck主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。

2.2、命令行篇

2.2.1 mysql之【查】:
show processlist; 查询数据库的链接数
show global status 查询数据库全局状态
show global status like ‘uptime’ 查询数据库运行时间
show global variables 查询数据库全局变量
show global variables like ‘max_allowed_packet’ 查询数据库允许最大数据包
show variables like ‘%char%’; 查看mysql字符集设置
show character set; 查看mysql支持的所有字符集
set variables_name=value; 用来修改全局变量
show engines;  查看当前数据库支持的引擎和默认的数据库引擎:
show OPEN TABLES where In_use > 0;  ##查询是否锁表
## mysql基本信息查询
select database()  ##查看当前数据库、用户、时间和版本
select user();
select now();
select version()select * from mysql.db WHERE db LIKE 'db_name';查看某数据库下账号
 show grants for 'user'@'机器ip'   ##查看用户权限
 grant all privileges on *.* to test@'10.10.10.%' identified by 'test123'  ##允许test用户远程从10.10.10上连接。
grant all privileges on test.* to test@localhost  ##授予全部权限
show variables like 'port';##查看mysql实例的端口。
select @@version; ##查询当前mysql的版本.
show variables like 'socket';##查看实例的socket数据。
 show variables like 'datadir';##查看实例的数据路径。
 explain ##查看语句的执行计划。
 show index from table_name ##查看表的索引情况
 select @@max_allowed_packet; ## 查询定义的packet大小
 show master logs;##查看所有的log文件,在主服务器上执行。(即查看所有binlog日志列表)
 purge binary logs to 'mysql-bin3306.000003';  #mysql-bin3306.000003之前的日志被purge
 show warnings; ##显示最近的警告详情。
 show variables \G; ##查看当前mysqld的所有参数,包括默认值。
 show grants for 'username'@'hostip' \G; ##查看某一个用户的权限,请替换参数username 和 hostip
 show variables like 'innodb_page_size'; ##查询页的大小。一旦数据库通过innodb_page_size设置完成,则后续无法更改。innodb_page_size是针对普通表的,压缩表不受限制。
 show variables like 'innodb_buffer_pool_size';##查看缓冲池的大小,每次读写数据都是通过buffer pool;当buffer pool中没有所需的数据时,才去硬盘中获取。该值设置的越大越好。buffer pool 也是以页(page)为单位的,且大小和innodb_page_size一致。
 show variables like 'innodb_buffer_pool_instances'; ##设置多少个缓冲池。设置多个instance可将热点打散,提高并发性能(建议设置成cpu个数值)
show engine innodb status \G;##查看buffer pool的状态。(查看默认存储引擎的类型:   SELECT @@default_storage_engine;)
set global innodb_buffer_pool_size=2*1024*1024*1024;##在线调整innodb_buffer_pool_size。MySQL 5.7之前的版本,修改该值,需要重启。
show variables like 'innodb_buffer_pool_dump_at_shutdown'; ##在MySQL 5.6 以后,可以在停机的时候dump出buffer pool的数据,然后在启动的时候Load进buffer pool。该功能可以在MySQL启动时自动预热,无需人工干预。
show variables like 'innodb_buffer_pool_dump_pct';##dumpd 百分比,是每个buffer pool文件,而不是整体。
show variables like 'innodb_buffer_pool_load_at_startup';## 启动时加载dump的文件,恢复到buffer pool中。dump的越多,启动的越慢。
show variables like "%innodb_flush_log_at_timeout%";##master thread 每秒刷新redo的buffer到logfile。5.7版本可以设置刷新间隔时间,默认是1秒。
show variables like 'binlog_format';##查看binlog的类型。statement 记录SQL语句;ROW 记录SQL语句操作的那些行(行的变化);mixed 混合statement 和 Row 格式(不推荐)
###查询进程:
SELECT * FROM sys.processlist 
SHOW FULL PROCESSLIST 
SELECT * FROM information_schema.processlist 
SELECT * FROM sys.session 
SELECT * FROM performance_schema.events_statements_current
show processlist \G;##显示正在执行的线程
kill thd_id  ##杀死线程/进程
###查询在锁事务,如果有可杀掉(kill 线程ID)
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
##联合查询锁定的表的具体事务:
select trx_id,INNODB_TRX.trx_state,INNODB_TRX.trx_started,se.conn_id as processlist_id,trx_lock_memory_bytes,se.user,se.command,se.state,se.current_statement,se.last_statement from information_schema.INNODB_TRX as is,sys.session as se where is.trx_mysql_thread_id=se.conn_id;
select * from innodb_lock_waits;##查看锁的信息,在数据库sys下执行
show variables like 'transaction_isolation'; ##查看隔离级别
set transaction_isolation='read-committed'; ##设置隔离级别
##锁等待查询
select * from information_schema.innodb_lock_waits;
select * from information_schema.innodb_locks;
select * from information_schema.innodb_trx;
##mysql查看数据库大小
SELECT sum(DATA_LENGTH)+sum(INDEX_LENGTH) FROM information_schema.TABLES where TABLE_SCHEMA='数据库名';
##mysql表占用的空间
SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='数据库名' AND TABLE_NAME='表名';
##查看表的最后mysql修改时间
select TABLE_NAME,UPDATE_TIME from INFORMATION_SCHEMA.tables where TABLE_SCHEMA='数据库名';
##查看当前的连接数
show status like 'Threads%';  ##其中,Threads_connected 表当前连接数,Threads_running 表当前的并发数
##查看最大连接数
show variables like '%max_connections%';
show variables like '%slave_parallel_workers%';##从数据库用来还原的并发线程数
##QPS (Query per second) (每秒查询量)查询
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Uptime';
select 42260778868/26924936 AS QPS  from dual;
##TPS(Transaction per second) (每秒事务量,如果是InnoDB会显示,没有InnoDB就不会显示)查看
SHOW GLOBAL STATUS LIKE 'Com_commit';
SHOW GLOBAL STATUS LIKE 'Com_rollback';
SHOW GLOBAL STATUS LIKE 'Uptime';
select (1676595+1)/26925163 as TPS from dual;
##慢查询及日志查看
mysql> show variables like 'long%'; #以秒为单位 mysql> set long_query_time=1; #超过1秒即为慢查询 
mysql> show variables like 'slow%'; #查看慢查询是否开启 | slow_query_log | ON | #是否打开日志记录 |
slow_query_log_file | /tmp/slow.log | #设置到什么位置 mysql> set global slow_query_log='ON'#打开日志记录
show variables like 'slow_query_log_file';## 查看慢查询日志的路径
show variables like 'long_query_time'; ##查看慢查询定义的阈值,单位是秒。记录的查询是大于该值,不包括该值
show variables like 'log_slow_slave_statements';##查看从服务器是否开启慢查询日志,ON代表开启
show variables like 'log_queries_not_using_indexes';##将没有使用索引的SQL语句记录到慢查询日志中
 show variables like 'log_throttle_queries_not_using_indexes';##限制每分钟内,在慢查询日志中,记录没有使用索引的次数。避免日志快速增长。
show variables like 'log_output'; ##查看日志的输出格式(file或table)
show variables like 'log_timestamps';##查看日志的时间信息,UTC时间或者SYSTEM时间
show variables like 'innodb_log_file_size';##查询log文件大小
.show variables like 'innodb_print_all_deadlocks';##设置为ON,表示将死锁信息打印到err_log中。
show binlog events in 'mysql-bin.000008'; ##查看指定binlog中的内容
flush binary logs;#刷新日志,并且会产生一个新的日志文件
show variables like "binlog_rows_query_log_events";##设置为ON,可以在ROW格式下,看到SQL的信息
how variables like "binlog_cache_size";##binlog默认写入到binlog_cache中,系统默认是32K,当有一个大的事务时(几百兆),内存中显然放不下那么多binlog,所以会记录到磁盘上
show global status like 'binlog_cache_disk_use';##记录了使用临时文件写二进制日志的次数。注意:写日志本来就停满的,如果cache写不下,再写入磁盘,然后再写binlog,就是写入2次磁盘,会更慢。如果参数binlog_cache_disk_use次数很多,就要看一下binlog_cache_size设置是否太小,或者事务本身是否太大。
##查库及表
show databases; -- 显示数据库
show create database db1 -- 显式数据库创建语句
show create table tablename \G; ##查看某表的创建脚本
describe 表名; -- 查看表结构
show create table 表名; -- 查看见表命令
show index from 表名; -- 查看表包含的索引
show table status like '%表名部分字符%'; -- 查看当前表的状态
select * from STATISTICS where table_name='XXX'\G ##查看表的统计信息
show variables like "default%tmp%";查看创建的临时表的存储引擎类型。
##表重复查询
select email from user group by email having count(email) > 1; -- 查询重复的列
select * from user where email in (
  select email from user group by email having count(u_email) > 1
  ); -- 查询重复数据列的行
##MHA查询
masterha_check_repl --conf=/etc/masterha/app1.conf   ##检查整个集群的复制状况
masterha_check_ssh --conf=/etc/masterha/app1.conf    ##检查MHA集群SSH配置。
masterha_check_status --conf=/etc/masterha/app1.conf ##检查MHA Manager的状态:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING" ,这代表MHA监控没有开启。
nohup masterha_manager --conf=/etc/masterha/app1.conf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 & ###监控进程通过nohup管理,可以通过jobs查看后台进程。
show slave hosts;##在master节点上执行,查看Slave节点数据。
CHANGE MASTER TO MASTER_HOST='172.XXX.XXX.XXX',MASTER_USER='replname',MASTER_PASSWORD='pwd',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154; ##change master 示例
若在Slave机器上对数据库进行修改或者删除,会导致主从的不一致,需对Slave机器设置为read_only = 1 ,让Slave提供只读操作。
   注意: read_only 仅仅对没有SUPER权限的用户有效(即 mysql.user表的Super_priv字段为Y),一般给App 的权限是不需要SUPER权限的。参数super_read_only 可以将有SUPER权限的用户也设置为只读,且该参数设置为ON 后, read_only 也跟着自动设置为ON。
show variables like "server_uuid";## 查看UUID。 GTID(G lobal T ransaction Id entifier) 全局事物ID。GTID = Server_UUID +
Transaction_ID 其中 Server_UUID 是全局唯一的,Transaction_ID 是自增的。
show variables like "%gtid%";##查看gtid相关数据及配置
##从服务器跳过一个错误的事务
stop slave;  关闭复制
set session gtid_next='4e659069-3cd8-11e5-9a49-001c4270714e:1'; #设置 gtid_next 为回放失败的gtid,在session里设置gtid_next,即跳过这个GTID
begin;
commit;执行一个空的事物,让回放失败的gtid对应到这个空的事物
SET SESSION GTID_NEXT = AUTOMATIC; #把gtid_next设置回来,还原gtid_next为automatic
 start slave;开启复制
2.2.2 mysql之【删】:
drop database db1; -- 删除数据库
drop table if exists tab1  ##删除表
alter table `Persons` drop column `City`;  ##删表字段
2.2.3 mysql之【改】:

1)更改数据库引擎:
更改方式1: 修改配置文件my.ini,将my-small.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB;
更改方式2: 在建表的时候指定,如下这样:

create table mytbl(   
    id int primary key,   
    name varchar(<strong>50</strong>)   
)type=MyISAM;

更改方式3: 建表后更改:alter table mytbl2 type = InnoDB;
验证:how create table table_name 查看修改后的引擎;

rename table Deal to Deal_201801, Deal_2018 to Deal;   ##重命名表
alter table tb1 engine=myisam;   ##修改表的数据引擎
alter table Persons modify column `City` varchar(255) DEFAULT NULL comment  改表字段

3)该密码:

set password for root@localhost = password('123456');
##方式2
use mysql;
update user set password=password('123456') where user='root' and host='localhost';
flush privileges;
2.2.4 mysql之【增】:
##在线创建索引
ALTER  TABLE  tb_name ALGORITHM=inplace, LOCK=NONE, ADD INDEX IDX_VID_CID(vid,cid)
##创建库
create databse db1; -- 创建一个数据库,数据库名在linux下大小写敏感
create database db1 character set utf8; -- 创建并定义字符集
带有字符集的建库语句
create database shang default character set gbk collate gbk_chinese_ci;
create database shang default character set utf8 collate utf8_gereral_ci;
##创建表
create tabale tb1 (
  id int not null,
  name varchar(10)
); -- 创建一张表
create tabale tb1 (
  id int not null,
  name varchar(10)
)engine=MYISAM default charset=utf8;
##给表增加字段
alter table Persons add column `City` varchar(255) DEFAULT NULL;
##单行出入
insert into tablename set column1 = value1 , coumn2 = values2...;
##多行插入
insert into tablename (column1,column2...) values (value1,value2....);
insert into tablename (column1,column2...) values (value1,value2....),(value1,)
2.2.5 mysql之登录及安全

/etc/init.d/mysqld start 等效mysql_safe --user=mysql &
登录提示符修改 prompt \u@oldboy \r:\m:\s->
mysql -uroot -p’面膜’ -S /data/3306/mysql.sock ##多实例登录
mysql -uroot -p -h 127.0.0.1 -P3307 ##远程登录,这时不需要socket
set password=password(‘新密码’) ##修改密码,完成后flush privileges

/etc/init.d/mysqld stop
mysqladmin -uroot -p’密码’ shutdown
不建议以下强制停止:
killall mysqld
pkill mysqld
killall -9 mysqld kill pid

删除无用的mysql库内的用户账号,删除默认存在的test数据库
可以删除root账号,新建一个超级账号代替root账号:
delete from mysql.user;
grant all privileges on . to system@‘localhost’ identified by system with grant option

mysql丢失恢复:

1) /etc/init.d/mysqld stop
2)mysqld_safe --skip-grant-tables --user=mysql & ##启动数据库,用mysql 无密码登录mysql数据库
多实例: mysqld_safe --default-file=/u01/data/3306/my.cnf --skip-grant-tables &
/u01/data/3306/mysql -S /u01/data/3306/mysql.sock
3) update mysql.user set password=password(‘root123’) where user=‘root123’ and host=‘localhost’ ##修改密码
然后 flush privileges;
4)mysqladmin -uroot -proot123 shutdown ##用mysqladmin 关闭数据库
多实例;mysqladmin -uroot -proot123 shutdown -S /etc/data/3306/mysql.sock
5) /etc/init.d/mysqld start
6)验证:mysql -uroot -p
多实例:mysql -uroot -p -S /u01/data/mysql.sock

2.2.6 其他命令
##数据库的登录与退出
mysql -u root -p -- 使用root身份登陆当前的数据库
mysql -u root -p -h server0 -- 使用root身份登陆到server0的数据库
quit --退出数据库
## 数据库用户权限配置
grant privileges on db1.tablename to user1@10.168.0.8 identified by "password"; -- 按数据库授所有权限
grant select,insert,update,delete,create temporary tables,execute,show view on `db1`.* to 'user1'@'10.168.0.8'; -- 按数据库授特定权限
revoke select,insert,update,delete,create temporary tables,execute,show view on `db1`.* from 'user1'@'10.168.0.8'; -- 按数据库取消特定权限
drop user 'user1'@'10.168.0.8'; -- 删除特定的用户
fluse privileges; -- 刷新权限表
###用户得权限都有:
SELECT、 insert、UPDATE、DELETE、CREATE、DROP、REFERENCES、INDEX;
ALTER、CREATE TEMPORARY TABLES、LOCK TABLES、EXECUTE;
CREATE VIEW、SHOW VIEW、 CREATE ROUTINE、ALTER ROUTINE、EVENT、TRIGGER(触发 )
2.2.7 系统类执行的数据库相关命令
##数据库备份
mysqldump -u username -p database > /backup/file.dump -- 备份数据库
mysqldump -uroot -p --all-databases | gzip -9 > file.gz -- 备份并压缩数据库
mysqldump -u username -p <./file.dump -- 还原数据库
mysqldump重要参数 --all-databases :备份所有的数据库;--databases DB1 [DB2 DB3] :备份指定的数据库;--single-transaction : 在一个事物中导出,确保产生一致性的备份,当前只对innodb支持;--master-data : 备份的时候dump出CHANGE MASTER 信息(file 和 pos),可供主从复制的时候使用, 默认值为1,当值设置为2 的时候,也会dump出信息,但是会被注释掉 。
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
由于上面在全备份的时候使用了-F选项,那么当数据备份操作刚开始的时候系统就会自动刷新log,这样就会自动产生一个新的binlog日志,这个新的binlog日志就会用来记录备份之后的数据库“增删改”操作
mysqladmin -uroot -p password "123456"

2.3、概念篇

2.3.1 Mysql数据库引擎

【概念】:

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。

【引擎类别】:

可用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(伯克利BDB),常常使用。

ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。

MYISAM:MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。   MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。

HEAP:HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。

INNODB和BERKLEYDB:INNODB和BERKLEYDB(BDB)数据库引擎都是造就MYSQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MYISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MYISAM引擎慢很多,但是INNODB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。

Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这篇文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

【名词解析:】

1)ACID

A 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.

C 事务的一致性(Consistency): 指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.

I 独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.

D 持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.两者区别:

  第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

在这里插入图片描述
  上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

在这里插入图片描述
  
  这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
  了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调(可能是指“非递增”的意思)的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调(可能是指“非递增”的意思)的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

2.3.2 Mysql两个文件(mysqld_safe与mysqld)区别

mysqld_safe与mysqld区别,直接运行mysqld程序来启动MySQL服务的方法很少见,mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。

用mysqld_safe脚本来启动MySQL服务器的做法在BSD风格的unix系统上很常见,非BSD风格的UNIX系统中的 mysql.server脚本其实也是调用mysqld_safe脚本去启动MySQL服务器的。

它通常做如下事情:

  1. 检查系统和选项。
  2. 检查MyISAM表。
  3. 保持MySQL服务器窗口。
  4. 启动并监视mysqld,如果因错误终止则重启。
  5. 将mysqld的错误消息发送到数据目录中的host_name.err 文件。
  6. 将mysqld_safe的屏幕输出发送到数据目录中的host_name.safe文件。

【mysqld】:是mysql的核心程序,用于管理mysql的数据库文件以及用户的请求操作。mysqld可以读取配置文件中的[mysqld]的部分。
mysqld启动命令: /bin/mysqld --defaults-file=/etc/mysql/my.cnf &

【mysqld_safe】:相当于多了一个守护进程,mysqld挂了会自动把mysqld进程拉起来
1.可以读取的配置部分[mysqld],[server],[myslqd_safe], 为了兼容mysql_safe也会读取[safe_mysqld]中的配置
2.调用的mysqld是可以在[mysqld_safe]中用-mysqld, --mysqld-version指定

mysqld_safe启动命令:/bin/mysqld_safe --defaluts-file=/etc/mysql/my.cnf &

在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。

mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。

注释:为了保持同旧版本MySQL的向后兼容性,MySQL二进制分发版仍然包括safe_mysqld作为mysqld_safe的符号链接。但是,你不应再依赖它,因为再将来将删掉它。
默认情况下,mysqld_safe尝试启动可执行mysqld-max(如果存在),否则启动mysqld。该行为的含义是:

· 在Linux中,MySQL-Max RPM依赖该mysqld_safe的行为。RPM安装可执行mysqld-max,使mysqld_safe从该点起自动使用可执行命令。
· 如果你安装包括mysqld-max服务器的MySQL-Max分发版,后面升级到非-Max的MySQL版本,mysqld_safe仍然试图运行旧的 mysqld-max服务器。升级时,你应手动删除旧的mysqld-max服务器以确保mysqld_safe运行新的mysqld服务器。
要想越过默认行为并显式指定你想要运行哪个服务器,为mysqld_safe指定 --mysqld 或 --mysqld-version 选项。

mysqld_safe期望下面的其中一个条件是真的:

1)可以根据调用mysqld_safe的目录找到服务器和数据库。在二进制分发版中,mysqld_safe看上去在bin和data目录的工作目录下。对于源码分发版,为libexec和var目录。如果你从MySQL安装目录执行mysqld_safe应满足该条件(例如,二进制分发版为/usr/local/mysql)。
2)如果不能根据工作目录找到服务器和数据库,mysqld_safe试图通过绝对路径对它们定位。典型位置为/usr/local/libexec和 /usr/local/var。实际位置由构建分发版时配置的值确定如果MySQL安装到配置时指定的位置,它们应该是正确的。

mysqld_safe试图通过工作目录找到服务器和数据库,只要你从MySQL安装目录运行mysqld_safe,可以将MySQL二进制分发版安装到其它位置,启动时从安装位置来启动该脚本,如果mysqld_safe失败,即使从MySQL安装目录调用仍然失败,你可以指定–ledir和–datadir选项来指示服务器和数据库在你的系统中的安装目录。

一般情况,你不应编辑mysqld_safe脚本。相反,应使用命令行选项或my.cnf选项文件的[mysqld_safe]部分的选项来配置mysqld_safe。一般不需要编mysqld_safe来正确启动服务器。

2.4、调优篇

2.4.1、Mysql binlog日志过大配置有效时长

背景:在Mysql主从场景中,master开启了binlog日志,用于记录了数据库的操作日志和MySQL数据库的主从同步或者数据恢复。然随时间积累,大量的binlog日志会占用许多磁盘空间;导致MySQL因磁盘空间不足而一直告警,甚至导致服务无法访问。

[mysqld]
max_binlog_size = 500M
expire_logs_days = 15  #保留指定日期范围内(15天)的bin log历史日志
# mysql8.0以下版本查看当前数据库日志binlog保存时效 以天为单位,默认0,即永不过期,最多只能设置99天
show variables like 'expire_logs_days';  #默认为0,现场版本为5.7.34
set global expire_logs_days=60;
#mysql8.0以上版本通过设置全局参数binlog_expire_logs_seconds修改binlog保存时间 以秒为单位;默认2592000 30天   14400   4小时;86400  1天;259200  3天
show variables like '%binlog_expire_logs_seconds%';
set global binlog_expire_logs_seconds=259200;
#查看binlog列表
mysql> show binary logs;
mysql> show variables like 'max_binlog_size'; #单位byte
mysql> set global expire_logs_days=7;
mysql> purge master logs to 'master-bin.000007';
mysql> flush logs;  //注意若 binlog非常多,不要轻易执行,可能导致IO争抢,建议使用purge命令予以清除
mysql> purge  binary  logs  before '20yy-yy-yy yy:00:00';
mysql> show binary logs;  #验证
mysql> show binlog events in 'master-bin.000002';  #查看指定binlog文件的内容
mysql> show binlog events;		#只查看第一个binlog文件的内容
                                    技术成就梦想 @ DataGuru 专业数据分析社区 网址:edu.dataguru.cn 1 MySQL 数据库运维 MySQL 数据库作为世界上最流行的开源数据库,以简单、易用、开源等特点, 收到互联网行业的推崇。随着去 IOE 运动的如火如荼,MySQL 数据库已经深入 到传统行业,大有改变行业格局。而与此同时,MySQL 数据库规模成倍的增长, 如何快速定位问题,解决问题?如何规模化、自动化运维?如何进行优化,提高 MySQL 数据库的性能?如何架构部署 MySQL 集群、架构跨 IDC 的分布式 MySQL 集群?如何实现 MySQL 数据库的 HA?将在本课程中跟大家分享。 课程大纲: 第 1 课 机器选型、系统规划 机器选型 业务评估--根据业务进行评估,转化为机器资源需求。 SSD vs HDD--熟悉 SSD 和 HDD 的架构设计,了解 SSD 的发展趋势。 成本评估--通过成本评估,选择合适机型。 系统规划 文件系统规划--根据 MySQL 的特点,规划文件系统,IO 调度。 数据库配置--根据 IO 写入特点,配置 MySQL 数据库。 第 2 课 安装部署 源
                                    foreach ($pc in $pcs) {.\psexec \\$pc -s "c:\windows\system32\ipconfig.exe" /registerdns}
Get-MailboxFolderPermission -Identity "m@m.com:\calendar"
remove-MailboxFolderPermission -Identity "hk.a@m.com:\calendar" -User "u, co"
Get-AzureADUser -all $true |
                                    SHOW PROCESSLIST显示哪些线程正在运行不在mysql提示符下使用时用mysql -uroot -e 'Show processlist' 或者 mysqladmin processlist如果您有root权限,您可以看到所有线程。否则,您只能看到登录的用户自己的线程,通常只会显示100条如果想看跟多的可以使用full修饰(show full processlist)参数i...
                                    不过也有地方不建议使用连接查询,因为连接查询属于重查询,数据量大容易造成阻塞,比如阿里就明文规定禁止用三个表以上的join。做项目的时候应该遵循重业务,轻数据库的原则,能在业务层聚合,就不要用跨表查询。MYSQL root密码修改完,需停止以Mysql跳过权限表的启动进程,再以正常方式启动MYSQL,再次以新的密码登陆即可进入Mysql数据库。命令mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名。命令mysqldump -u 用户名 -p 数据库名 > 导出的文件名。
2.7.2 知道何时读完文件:feof() 
2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv() 
2.7.4 读取整个文件:readfile()、fpassthru()和file() 
2.7.5 读取一个字符:fgetc() 
2.7.6 读取任意长度:fread() 
2.8 使用其他有用的文件函数 
2.8.1 查看文件是否存在:file_exists() 
2.8.2 确定文件大小:filesize() 
2.8.3 删除一个文件:unlink() 
2.8.4 在文件中定位:rewind()、fseek()和ftell() 
2.9 文件锁定 
2.10 更好的方式:数据库管理系统 
2.10.1 使用普通文件的几个问题 
2.10.2 RDBMS是如何解决这些问题的 
2.11 进一步学习 
2.12 下一章 
第3章 使用数组 
3.1 什么是数组 
3.2 数字索引数组 
3.2.1 数字索引数组的初始化 
3.2.2 访问数组的内容 
3.2.3 使用循环访问数组 
3.3 使用不同索引的数组 
3.3.1 初始化相关数组 
3.3.2 访问数组元素 
3.3.3 使用循环语句 
3.4 数组操作符 
3.5 多维数组 
3.6 数组排序 
3.6.1 使用sort()函数 
3.6.2 使用asort()函数和ksort()函数对相关数组排序 
3.6.3 反向排序 
3.7 多维数组的排序 
3.7.1 用户定义排序 
3.7.2 反向用户排序 
3.8 对数组进行重新排序 
3.8.1 使用shuffle()函数 
3.8.2 使用array_reverse()函数 
3.9 从文件载入数组 
3.10 执行其他的数组操作 
3.10.1 在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev() 
3.10.2 对数组的每一个元素应用任何函数:array_walk() 
3.10.3 统计数组元素个数:count()、sizeof()和array_count_values() 
3.10.4 将数组转换成标量变量:extract() 
3.11 进一步学习 
3.12 下一章 
第4章 字符串操作与正则表达式 
4.1 创建一个示例应用程序:智能表单邮件 
4.2 字符串的格式化 
4.2.1 字符串的整理:chop()、ltrim()和trim() 
4.2.2 格式化字符串以便显示 
4.2.3 格式化字符串以便存储:addslashes()和stripslashes() 
4.3 用字符串函数连接和分割字符串 
4.3.1 使用函数explode()、implode()和join() 
4.3.2 使用strtok()函数 
4.3.3 使用substr()函数 
4.4 字符串的比较 
4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp() 
4.4.2 使用strlen()函数测试字符串的长度 
4.5 使用字符串函数匹配和替换子字符串 
4.5.1 在字符串中查找字符串:strstr()、strchr()、strrchr()和stristr() 
4.5.2 查找子字符串的位置:strpos()、strrpos() 
4.5.3 替换子字符串:str_replace()、substr_replace() 
4.6 正则表达式的介绍 
4.6.1 基础知识 
4.6.2 字符集和类 
4.6.3 重复 
4.6.4 子表达式 
4.6.5 子表达式计数 
4.6.6 定位到字符串的开始或末尾 
4.6.7 分支 
4.6.8 匹配特殊字符 
4.6.9 特殊字符一览 
4.6.10 在智能表单中应用 
4.7 用正则表达式查找子字符串 
4.8 使用正则表达式分割字符串 
4.9 比较字符串函数和正则表达式函数 
4.10 进一步学习 
4.11 下一章 
第5章 代码重用与函数编写 
5.1 代码重用的好处 
5.1.1 成本 
5.1.2 可靠性 
5.1.3 一致性 
5.2 使用require()和include()函数 
5.2.1 文件扩展名和require()语句 
5.2.2 使用require()制作Web站点的模版 
5.2.3 使用auto_prepend_file和auto_append_file 
5.3 在PHP中使用函数 
5.3.1 调用函数 
5.3.2 调用未定义的函数 
5.3.3 理解字母大小写和函数名称 
5.4 理解为什么要定义自己的函数 
5.5 了解基本的函数结构 
5.5.1 函数命名
5.6 使用参数 
5.7 理解作用域 
5.8 参数的引用传递和值传递 
5.9 使用Return关键字 
5.9.1 从函数返回一个值 
5.10 实现递归 
5.10.1 名称空间
5.11 进一步学习 
5.12 下一章 
第6章 面向对象的PHP 
6.1 理解面向对象的概念 
6.1.1 类和对象 
6.1.2 多态性 
6.1.3 继承 
6.2 在PHP中创建类、属性和操作 
6.2.1 类的结构 
6.2.2 构造函数 
6.2.3 析构函数 
6.3 类的实例化 
6.4 使用类的属性 
6.5 使用private和public关键字控制访问 
6.6 类操作的调用 
6.7 在PHP中实现继承 
6.7.1 通过继承使用private和protected访问修饰符控制可见性 
6.7.2 重载 
6.7.3 使用final关键字禁止继承和重载 
6.7.4 理解多重继承 
6.7.5 实现接口 
6.8 类的设计 
6.9 编写类代码 
6.10 理解PHP面向对象新的高级功能 
6.10.1 使用Per-Class常量 
6.10.2 实现静态方法 
6.10.3 检查类的类型和类型提示 
6.10.4 克隆对象 
6.10.5 使用抽象类 
6.10.6 使用__call()重载方法 
6.10.7 使用__autoload()方法 
6.10.8 实现迭代器和迭代 
6.10.9 将类转换成字符串 
6.10.10 使用Reflection(反射)API 
6.11 下一章 
第7章 错误和 异常处理 
7.1 异常处理的概念 
7.2 Exception类 
7.3 用户自定义异常 
7.4 Bob的汽车零部件商店应用程序的异常 
7.5 异常和PHP的其他错误处理机制 
7.6 进一步学习 
7.7 下一章 
第二篇 使用MySQL
第8章 设计Web数据库 
8.1 关系数据库的概念 
8.1.1 表格 
8.1.2 列 
8.1.3 行 
8.1.4 值 
8.1.5 键 
8.1.6 模式 
8.1.7 关系 
8.2 如何设计Web数据库 
8.2.1 考虑要建模的实际对象 
8.2.2 避免保存冗余数据 
8.2.3 使用原子列值 
8.2.4 选择有意义的键 
8.2.5 考虑需要询问数据库的问题 
8.2.6 避免多个空属性的设计 
8.2.7 表格类型的总结 
8.3 Web数据库架构 
8.4 进一步学习 
8.5 下一章 
第9章 创建Web数据库 
9.1 使用MySQL监视程序 
9.2 登录到MySQL 
9.3 创建数据库和用户 
9.4 设置用户与权限 
9.5 MySQL权限系统的介绍 
9.5.1 最少权限原则 
9.5.2 创建用户:GRANT命令 
9.5.3 权限的类型和级别 
9.5.4 REVOKE命令 
9.5.5 使用GRANT和REVOKE的例子 
9.6 创建一个Web用户 
9.7 使用正确的数据库 
9.8 创建数据库表 
9.8.1 理解其他关键字的意思 
9.8.2 理解列的类型 
9.8.3 用SHOW和DESCRIBE来查看数据库 
9.8.4 创建索引 
9.9 理解MySQL的标识符 
9.10 选择列数据类型 
9.10.1 数字类型 
9.10.2 日期和时间类型 
9.10.3 字符串类型 
9.11 进一步学习 
9.12 下一章 
第10章 使用MySQL数据库 
10.1 SQL是什么 
10.2 在数据库中插入数据 
10.3 从数据库中获取数据 
10.3.1 获取满足特定条件的数据 
10.3.2 从多个表中获取数据 
10.3.3 以特定的顺序获取数据 
10.3.4 分组与合计数据 
10.3.5 选择要返回的行 
10.3.6 使用子查询 
10.4 更新数据库记录 
10.5 创建后修改表 
10.6 删除数据库中的记录 
10.7 表的删除 
10.8 删除整个数据库 
10.9 进一步学习 
10.10 下一章 
第11章 使用PHP从Web访问MySQL数据库 
11.1 Web数据库架构的工作原理 
11.2 从Web查询数据库的基本步骤 
11.2.1 检查与过滤用户输入数据 
11.2.2 建立一个连接 
11.2.3 选择使用的数据库 
11.2.4 查询数据库 
11.2.5 检索查询结果 
11.2.6 从数据库断开连接 
11.3 将新信息放入数据库 
11.4 使用Prepared语句 
11.5 使用PHP与数据库交互的其他接口 
11.5.1 使用常规的数据库接口:PEAR MDB2 
11.6 进一步学习 
11.7 下一章 
第12章 MySQL高级管理 
12.1 深入理解权限系统 
12.1.1 user表 
12.1.2 db表和host表 
12.1.3 tables_priv表,columns_priv表和procs_priv表 
12.1.4 访问控制:MySQL如何使用Grant表 
12.1.5 更新权限:修改什么时候生效 
12.2 提高MySQL数据库的安全性 
12.2.1 从操作系统角度来保护MySQL 
12.2.2 密码 
12.2.3 用户权限 
12.2.4 Web问题 
12.3 获取更多关于数据库的信息 
12.3.1 使用SHOW获取信息 
12.3.2 使用DESCRIBE获取关于列的信息 
12.3.3 用EXPLAIN理解查询操作的工作过程 
12.4 数据库的优化 
12.4.1 设计优化 
12.4.2 权限 
12.4.3 表的优化 
12.4.4 使用索引 
12.4.5 使用默认值 
12.4.6 其他技巧 
12.5 备份MySQL数据库 
12.6 恢复MySQL数据库 
12.7 实现复制 
12.7.1 设置主服务器 
12.7.2 执行初始的数据传输 
12.7.3 设置一个/多个从服务器 
12.8 进一步学习 
12.9 下一章 
第13章 MySQL高级编程 
13.1 LOAD DATA INFILE语句 
13.2 存储引擎 
13.3 事务 
13.3.1 理解事务的定义 
13.3.2 通过InnoDB使用事务 
13.4 外键 
13.5 存储过程 
13.5.1 基本示例 
13.5.2 局部变量 
13.5.3 游标和控制结构 
13.6 进一步学习 
13.7 下一章 
第三篇 电子商务与安全性
第14章 运营一个电子商务网站 
14.1 我们要实现什么目标 
14.2 考虑电子商务网站的类型 
14.2.1 使用在线说明书公布信息 
14.2.2 接收产品或服务的订单 
14.2.3 提供服务和数字产品 
14.2.4 为产品或服务增值 
14.2.5 减少成本 
14.3 理解风险和威胁 
14.3.1 网络黑客 
14.3.2 不能招揽足够的生意 
14.3.3 计算机硬件故障 
14.3.4 电力、通信、网络或运输故障 
14.3.5 广泛的竞争 
14.3.6 软件错误 
14.3.7 不断变化的政府政策和税收 
14.3.8 系统容量限制 
14.4 选择一个策略 
14.5 下一章 
第15章 电子商务的安全问题 
15.1 信息的重要程度 
15.2 安全威胁 
15.2.1 机密数据的泄露 
15.2.2 数据丢失和数据破坏 
15.2.3 数据修改 
15.2.4 拒绝服务 
15.2.5 软件错误 
15.2.6 否认 
15.3 易用性,性能、成本和安全性 
15.4 建立一个安全政策 
15.5 身份验证原则 
15.6 加密技术基础 
15.6.1 私有密钥加密 
15.6.2 公有密钥加密 
15.6.3 数字签名 
15.7 数字证书 
15.8 安全的Web服务器 
15.9 审计与日志记录 
15.10 防火墙 
15.11 备份数据 
15.11.1 备份常规文件 
15.11.2 备份与恢复MySQL数据库 
15.12 自然环境安全 
15.13 下一章 
第16章 Web应用的安全
16.1处理安全性问题的策略
16.1.1 以正确心态为开始
16.1.2 安全性和可用性之间的平衡
16.1.3 安全监视
16.1.4 基本方法
16.2 识别所面临的威胁
16.2.1 访问或修改敏感数据
16.2.2 数据丢失或破坏
16.2.3 拒绝服务
16.2.4 恶意代码注入
16.2.5 服务器被攻破
16.3了解与我们“打交道”的用户
16.3.1 破解人员
16.3.2 受影响机器的未知情用户
16.3.3 对公司不满的员工
16.3.4 硬件被盗
16.3.5 我们自身
16.4 代码的安全性
16.4.1 过滤用户输入
16.4.2 转义输出
16.4.3 代码组织
16.4.4 代码自身的问题
16.4.5 文件系统因素
16.4.6 代码稳定性和缺陷
16.4.7 执行引号和exec
16.5 Web服务器和PHP的安全性
16.5.1 保持软件的更新
16.5.2 查看php.ini文件
16.5.3 Web服务器配置
16.5.4 Web应用的商业主机服务
16.6 数据库服务器的安全性
16.6.1 用户和权限系统
16.6.2发送数据至服务器
16.6.3 连接服务器
16.6.4 运行服务器
16.7 保护网络
16.7.1 安装防火墙
16.7.2使用隔离区域(DMZ)
16.7.3应对DoS和DDoS攻击
16.8 计算机和操作系统的安全性
16.8.1 保持操作系统的更新
16.8.2只运行必须的软件
16.8.3 服务器的物理安全性 
16.9 灾难计划
16.10 下一章
第17章 使用PHP和MySQL实现身份验证 
17.1 识别访问者 
17.2 实现访问控制 
17.2.1 保存密码 
17.2.2 密码的加密 
17.2.3 保护多个网页 
17.3 使用基本身份验证 
17.4 在PHP中使用基本身份验证 
17.5 在Apache的.htaccess文件中使用基本身份验证 
17.6 使用mod_auth_mysql身份验证 
17.6.1 安装mod_auth_mysql 
17.6.2 使用mod_auth_mysql 
17.7 创建自定义身份验证 
17.8 进一步学习 
17.9 下一章 
第18章 使用PHP和MySQL实现安全事务 
18.1 提供安全的事务处理 
18.1.1 用户机器 
18.1.2 Internet 
18.1.3 我们的系统 
18.2 使用加密套接字层(SSL) 
18.3 屏蔽用户的输入 
18.4 提供安全存储 
18.5 存储信用卡号码 
18.6 在PHP中使用加密技术 
18.6.1 安装GPG 
18.6.2 测试GPG 
18.7 进一步学习 
18.8 下一章 
第四篇 PHP的高级技术
第19章 与文件系统和服务器的交互 
19.1 文件上载 
19.1.1 文件上载的HTML代码 
19.1.2 编写处理文件的PHP 
19.1.3 避免常见上载问题 
19.2 使用目录函数 
19.2.1 从目录读取 
19.2.2 获得当前目录的信息 
19.2.3 创建和删除目录 
19.3 与文件系统的交互 
19.3.1 获取文件信息 
19.3.2 更改文件属性 
19.3.3 创建、删除和移动文件 
19.4 使用程序执行函数 
19.5 与环境变量交互:getenv()和putenv() 
19.6 进一步学习 
19.7 下一章 
第20章 使用网络函数和协议函数 
20.1 了解可供使用的协议 
20.2 发送和读取电子邮件 
20.3 使用其他Web站点的数据 
20.4 使用网络查找函数 
20.5 备份或镜像一个文件
20.5.1 使用FTP备份或镜像一个文件 
20.5.2 上传文件 
20.5.3 避免超时 
20.5.4 使用其他的FTP函数 
20.6 进一步学习 
20.7 下一章 
第21章 日期和时间的管理 
21.1 在PHP中获取日期和时间 
21.1.1 使用date()函数 
21.1.2 使用UNIX时间戳 
21.1.3 使用getdate()函数 
21.1.4 使用checkdate()函数检验日期有效性 
21.1.5 格式化时间戳
21.2 在PHP日期格式和MySQL日期格式之间进行转换 
21.3 在PHP中计算日期 
21.4 在MySQL中计算日期 
21.5 使用微秒 
21.6 使用日历函数 
21.7 进一步学习 
21.8 下一章 
第22章 创建图像 
22.1 在PHP中设置图像支持 
22.2 理解图像格式 
22.2.1 JPEG 
22.2.2 PNG 
22.2.3 WBMP 
22.2.4 GIF 
22.3 创建图像 
22.3.1 创建一个背景图像 
22.3.2 在图像上绘图或打印文本 
22.3.3 输出最终图形 
22.3.4 清理 
22.4 在其他页面中使用自动生成的图像 
22.5 使用文本和字体创建图像 
22.5.1 创建基本画布 
22.5.2 将文本调整到适合按钮 
22.5.3 放置文本 
22.5.4 将文本写到按钮上 
22.5.5 完成 
22.6 绘制图像与用图表描绘数据 
22.7 使用其他的图像函数 
22.8 进一步学习 
22.9 下一章 
第23章 在PHP中使用会话控制 
23.1 什么是会话控制 
23.2 理解基本的会话功能 
23.2.1 什么是cookie 
23.2.2 通过PHP设置cookie 
23.2.3 在会话中使用cookie 
23.2.4 存储会话 ID 
23.3 实现简单的会话 
23.3.1 开始一个会话 
23.3.2 注册一个会话变量 
23.3.3 使用会话变量 
23.3.4 注销变量与销毁会话 
23.4 创建一个简单的会话例子 
23.5 配置会话控制 
23.6 通过会话控制实现身份验证 
23.7 进一步学习 
23.8 下一章 
第24章 其他有用的特性 
24.1 使用eval()函数对字符串求值 
24.2 终止执行:die和exit 
24.3 序列化变量和对象 
24.4 获取PHP环境信息 
24.4.1 找到所加载的PHP扩展部件 
24.4.2 识别脚本所有者 
24.4.3 确定脚本最近修改时间 
24.5 暂时改变运行时环境 
24.6 源代码加亮 
24.7 在命令行中使用PHP 
24.8 下一章 
第五篇 创建实用的PHP和MySQL项目
第25章 在大型项目中使用PHP和MySQL 
25.1 在Web开发中应用软件工程 
25.2 规划和运行Web应用程序项目 
25.3 重用代码 
25.4 编写可维护代码 
25.4.1 编码标准 
25.4.2 分解代码 
25.4.3 使用标准的目录结构 
25.4.4 文档化和共享内部函数 
25.5 实现版本控制 
25.6 选择一个开发环境 
25.7 项目的文档化 
25.8 建立原型 
25.9 将逻辑和内容分离 
25.10 优化代码 
25.10.1 使用简单优化 
25.10.2 使用Zend产品 
25.11 测试 
25.12 进一步学习 
25.13 下一章 
第26章 调试 
26.1 编程错误 
26.1.1 语法错误 
26.1.2 运行时错误 
26.1.3 逻辑错误 
26.2 使用变量帮助调试 
26.3 错误报告级别 
26.4 改变错误报告设置 
26.5 触发自定义错误 
26.6 巧妙地处理错误 
26.7 下一章 
第27章 建立用户身份验证机制和个性化设置 
27.1 解决方案的组成 
27.1.1 用户识别和个性化设置 
27.1.2 保存书签 
27.1.3 推荐书签 
27.2 解决方案概述 
27.3 实现数据库 
27.4 实现基本的网站 
27.5 实现用户身份验证 
27.5.1 注册 
27.5.2 登录 
27.5.3 登出 
27.5.4 修改密码 
27.5.5 重设遗忘的密码 
27.6 实现书签的存储和检索 
27.6.1 添加书签 
27.6.2 显示书签 
27.6.3 删除书签 
27.7 实现书签推荐 
27.8 考虑可能的扩展 
27.9 下一章 
第28章 创建一个购物车 
28.1 解决方案的组成 
28.1.1 创建一个在线目录 
28.1.2 在用户购买商品的时候记录购买行为 
28.1.3 实现一个付款系统 
28.1.4 创建一个管理界面 
28.2 解决方案概述 
28.3 实现数据库 
28.4 实现在线目录 
28.4.1 列出目录 
28.4.2 列出一个目录中的所有图书 
28.4.3 显示图书详细信息 
28.5 实现购物车 
28.5.1 使用show_cart.php脚本 
28.5.2 浏览购物车 
28.5.3 将物品添加到购物库 
28.5.4 保存更新后的购物车 
28.5.5 打印标题栏摘要 
28.5.6 结账 
28.6 实现付款 
28.7 实现一个管理界面 
28.8 扩展该项目 
28.9 使用一个已有系统 
28.10 下一章 
第29章 创建一个基于Web的电子邮件服务系统 
29.1 解决方案的组成 
29.1.1 电子邮件协议:POP3和IMAP 
29.1.2 PHP对POP3和IMAP的支持
29.2 解决方案概述 
29.3 建立数据库 
29.4 了解脚本架构 
29.5 登录与登出 
29.6 建立账户 
29.6.1 创建一个新账户 
29.6.2 修改已有账户 
29.6.3 删除账户 
29.7 阅读邮件 
29.7.1 选择账户 
29.7.2 查看邮箱内容 
29.7.3 阅读邮件消息 
29.7.4 查看消息标题 
29.7.5 删除邮件 
29.8 发送邮件 
29.8.1 发送一则新消息 
29.8.2 回复或转发邮件 
29.9 扩展这个项目 
29.10 下一章 
第30章 创建一个邮件列表管理器 
30.1 解决方案的组成 
30.1.1 建立列表和订阅者数据库 
30.1.2 上载新闻信件 
30.1.3 发送带附件的邮件 
30.2 解决方案概述 
30.3 建立数据库 
30.4 定义脚本架构 
30.5 实现登录 
30.5.1 新账户的创建 
30.5.2 登录 
30.6 用户函数的实现 
30.6.1 查看列表 
30.6.2 查看邮件列表信息 
30.6.3 查看邮件列表存档 
30.6.4 订阅与取消订阅 
30.6.5 更改账户设置 
30.6.6 更改密码 
30.6.7 登出 
30.7 管理功能的实现 
30.7.1 创建新的邮件列表 
30.7.2 上载新的新闻信件 
30.7.3 多文件上载的处理 
30.7.4 预览新闻信件 
30.7.5 发送邮件 
30.8 扩展这个项目 
30.9 下一章 
第31章 创建一个Web论坛 
31.1 理解流程
31.2 解决方案的组成 
31.3 解决方案概述 
31.4 数据库的设计 
31.5 查看文章的树型结构 
31.5.1 展开和折迭 
31.5.2 显示文章 
31.5.3 使用treenode类 
31.6 查看单个的文章 
31.7 添加新文章 
31.8 添加扩充 
31.9 使用一个已有的系统 
31.10 下一章 
第32章 生成PDF格式的个性化文档 
32.1 项目概述
32.1.1 评估文档格式 
32.2 解决方案的组成 
32.2.1 问题与回答系统 
32.2.2 文档生成软件 
32.3 解决方案概述 
32.3.1 提问 
32.3.2 给答题评分 
32.3.3 生成RTF证书 
32.3.4 从模板生成PDF证书 
32.3.5 使用PDFlib生成PDF文档 
32.3.6 使用PDFlib的一个“Hello World”程序 
32.3.7 用PDFlib生成证书 
32.4 处理标题的问题 
32.5 扩展该项目 
32.6 下一章 
第33章 使用XML和SOAP来连接Web服务 
33.1 项目概述:使用XML和Web服务
33.1.1 理解XML
33.1.2 理解Web服务 
33.2 解决方案的组成 
33.2.1 使用Amazon的Web服务接口 
33.2.2 XML的解析:REST响应
33.2.3 在PHP中使用SOAP 
33.2.4 缓存 
33.3 解决方案概述 
33.3.1 核心应用程序 
33.3.2 显示特定种类的图书 
33.3.3 获得一个AmazonResultSet类 
33.3.4 使用REST发送和接收请求
33.3.5 使用SOAP发送和接收请求
33.3.6 缓存请求返回的数据 
33.3.7 创建购物车 
33.3.8 到Amazon付账 
33.4 安装项目代码 
33.5 扩展这个项目 
33.6 进一步学习 
第34 章使用Ajax构建Web 2.0应用
34.1 Ajax 是什么?
34.1.1 HTTP请求和响应
34.1. 2 DHTML和XHTML
34.1.3 级联样式单(CSS)
34.1.4 客户端编程
34.1.5 服务器端编程
34.1.6 XML和XSLT
34.2 Ajax基础
34.2.1 XMLHTTPRequest对象
34.2.2 与服务器通信
34.2.3 处理服务器响应
34.2.4 整合应用
34.3 在以前的项目添加Ajax元素
34.3.1在PHPBookmark应用中添加Ajax元素
34.4 进一步学习
34.4.1 进一步了解文档对象模型(DOM)
34.4.2 Ajax应用可用的JavaScript函数库
34.4.3 Ajax开发人员网站
第六篇 附录
附录A 安装PHP及MySQL 
附录B Web资源 
第1章 PHP快速入门教程
第2章 数据的存储与检索
第3章 使用数组
第4章 字符串操作与正则表达式
第5章 代码重用与函数编写
第6章 面向对象的PHP
第7章 错误和异常处理
                                    最开始,服务器部署使用的宝塔面板,数据库运维管理全都是在宝塔上可视化操作,并没有真正的面对数据库执行过命令。出于某些原因,后续不准备再继续使用宝塔面板,所以,记录一下关于 MySQL 数据库管理方面相关的方法和命令。
                                    文章目录1. 错误日志2. 二进制日志2.1 介绍2.2 格式2.3 查看2.4 删除3. 查询日志4. 查询日志
1. 错误日志
错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。
该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为 mysqld.log 。查看日志位置:
show variables like '%log_error%';
                                    sql要尽可能简单,拆分事务要简单,禁止包含非数据库操作逻辑禁止使用SELECT *,只获取必要的字段读取多余列增加CPU、IO、NET消耗,影响性能、带宽、IO不能有效利用覆盖索引(假如查询的列都在索引里,直接从索引获取数据,而不必再次读取数据行)SELECT * 容易在增加删除字段等表结构变更后后出现问题禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属...