Mysql数据库的用户和日志管理

Mysql数据库的用户和日志管理

数据库的用户管理

1.mysql用户账号管理
	用户账号
		user@host
		user:账户名称
		host:此账户可通过哪些客户端主机请求创建连接线程,可以是ip、主机名或network。 
			
			%:任意长度的任意字符;
			_:任意单个字符;
		
	1)新建用户
		create user 'user_name'@'来源地址' [identified by [password]'密码'];
		help create user
			create user user_specification [, user_specification] ...
				user_specification:user [identified by [password] 'password'| identified with auth_plugin [as 'auth_string']]
	2)设置密码
		1》set
			set password=password('密码'); ##修改当前登录用的密码
			set password for 'user_name'@'来源地址'=password('密码'); ##设置其他用户的密码
			help set password
				set password [for user]={password('cleartext password')| old_password('cleartext password')| 'encrypted password'}
		2》update
			update  库.表  set  password=password(' ') where user='user_name'  and  host='host_addr';
		3》mysqladmin -uuser_name -hhost_addr -p password 'new_password'
			
	3)删除用户
		drop user 'user_name'@'来源地址'...
		help drop
			DROP USER user [, user] ...
	4)重命名及修改主机
		rename user 'user_name_old'@'host_old' to 'user_name_new'@'host_new'; ##可以只是修改用户名或只是修改主机。
		help rename user
			RENAME USER old_user TO new_user [, old_user TO new_user] ...
	
	5)mysql 重新加载授权表
		flush privileges
	
2.忘记root的密码的解决方法
	方法一:
		1)关闭mysqld服务
			service mysqld stop
				Shutting down MySQL....                                    [  OK  ]
			
		2)跳过grant表授权,进入安全模式,使用--skip-grant-tables选项,并在后台运行
			mysqld_safe --skip-grant-tables&
			jobs
				[1]+  Running                 mysqld_safe --skip-grant-tables &
		3)进入安全模式修改密码
			mysql
			MariaDB [(none)]> use mysql;
			MariaDB [mysql]> update user set Password=password('xm1234') where user='root';
			MariaDB [mysql]> flush privileges;
			MariaDB [mysql]> exit
			killall -u mysql
		4)重启mysql服务并尝试
			service mysqld start
			mysql -uroot -p
	方法二:
		vim /etc/mysql/my.cnf
			 skip_grant_tables
		service mysqld restart
		mysql
		MariaDB [(none)]> use mysql;
		MariaDB [mysql]> update user set Password=password('xm1234') where user='root';
		MariaDB [mysql]> flush privileges;
		MariaDB [mysql]> exit
		vim /etc/mysql/my.cnf
			 skip_grant_tables 去掉
		service mysqld restart
		mysql -uroot -p


3.用户权限设置 
	mysql权限类别
		库级别,表级别,字段级别,管理类,程序类
		管理类:
			create user
			reload
			lock tables
			replication client, replication slave
			shutdown
			file
			show databases
			process 
			super
		程序类:
			create,alter,drop,execute
				function
				procedure
				trigger
		
		库和表级别:
			create,alter,drop,show,grant
				index
				view
		字段级别:
		
		元数据:
			db, host, user
			tables_priv, column_priv, procs_priv, proxies_priv
		
		所有权限:
			all, all privileges
	
	show grants for 用户名;    
	grant select on 数据库名.* to 用户名;                ##给用户的数据库的所有权限
	revoke select on 数据库名.* to 用户名;    ##grant的反操作,去除权限;
	
	1》设置用户权限(用户不存在时则是新建用户)
		grant 权限列表 on 库名.表名 to '用户名'@'来源地址' [identified by '密码'];
		grant select on 数据库名.*  to 用户名;
		grant all on *.* to 用户名;
		flush privileges; ##刷新权限
		help grand
			grant priv_type [(column_list)] [, priv_type [(column_list)]] ...
			    on [object_type] priv_level
			    to user_specification [, user_specification] ... [require {none | ssl_option [[and] ssl_option] ...}]
			    [with with_option ...]
			grant proxy 
				on user_specification 
				to user_specification [, user_specification] ... 
				[with grant option]
					object_type:
					    table | function | procedure
					priv_level:
					    * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name
					user_specification:
					    user
					    [identified by [password] 'password' | identified with auth_plugin [as 'auth_string'] ]
					ssl_option:
					    ssl | x509 | cipher 'cipher' | issuer 'issuer'  | subject 'subject'
					with_option:
					    grant option  | max_queries_per_hour count  | max_updates_per_hour count | max_connections_per_hour count | max_user_connections count
		示例:
			create user 'jeffrey'@'localhost' identified by 'mypass';
			grant all on db1.* to 'jeffrey'@'localhost';
			grant select on db2.invoice to 'jeffrey'@'localhost';
			grant usage on *.* to 'jeffrey'@'localhost' with max_queries_per_hour 90;
			grant all on *.* to 'root'@'%' indentified by 'xxxxx';
			grant select on imployee_salary.* to 'amber'@'localhsot' identified by 'xxxx';
			flush privileges;##刷新权限
	2》查看用户权限
		show grants; ##查看当前登录用户的授权信息。
		show grants for '用户名'@'主机地址';
		help show grants
			show grants [for user]
			show grants;
			show grants for current_user;
			show grants for current_user();
			
	3》撤销用户权限
		revoke 权限列表 on 库名.表名 from '用户名'@'来源地址'
		revoke select on '数据库名'.* from '用户名'@'来源地址';
		revoke all on *.* from '用户名'@'来源地址';
		flush privileges; ##刷新权限
		help revoke
			revoke priv_type [(column_list)][, priv_type [(column_list)]] ... 
				on [object_type] priv_level 
				from user [, user] ...
			revoke all privileges, grant option from user [, user] ...
			revoke proxy on user from user [, user] ...
	4》常见权限列表

数据库的日志管理

mysql日志:
	错误日志:log_error,log_warnings
	通用查询日志:general_log
	二进制日志:binlog
	慢速查询日志:log_slow_queries
	中继日志:relay_log
	事务日志:innodb_log
	由于版本的不同,以下的目录文件目录也有所不同
	1)错误日志
		错误日志本身所定义的内容本身是可以定义的 。
		错误日志记录的信息:
			1》mysqld启动和关闭过程中输出的信息。
				未必是错误信息,比如mysql是如何去初始化存储引擎的过程记录在错误日志里等等
			2》mysqld运行中产生的错误信息。
				比如sock文件找不到,无法加载mysql数据库的数据文件,如果忘记初始化mysql或data dir路径找不到,或权限不正确等,都会记录在此。
			3》事件调度器(event scheduler)运行时产生的信息。
				一旦mysql调度启动一个计划任务的时候,它也会将相关信息记录在错误日志中。
			4》 主从复制架构中,从服务器复制线程启动时产生的日志;
		修改主配置文件my.cnf
			[mysqld]
			log-error=mysql_error.log(绝对路径或若直接文件名则会存储到数据目录下)
			log_warnings={on|off|2}:将不将警告信息记录日志
				log_warnings表示警告信息是否记录在错误日志中,1和0也就是on和off表示记录和不记录,2则表示失败拒绝的连接信息。
		在mysql服务器上查看错误日志的配置
			mysql> show global variables like '%log%';
			| log_error                               |/mydata/data/localhost.err         |
			| log_warnings                            | 1                                 |
			
	2)通用查询日志
		mysql所有查询语句都会被记录。
		默认关闭此项记录,一般作调试用,平时开启会记录大量数据占用磁盘空间。
		存储位置:文件,表(table,mysql.general_log)
		默认,存储在数据目录下。
		修改主配置文件my.cnf。
			[mysqld]
			general_log={on|off}
			general_log_file=mysql_general.log (绝对路径或若直接文件名则会存储到数据目录下)
			log_output={file|table|file,table|none}:日志输出类型
		在mysql服务器上查看查询日志的配置
			MariaDB [(none)]> show global variables where variable_name like '%general_log%' or variable_name='log_output';
			+------------------+---------------+
			| Variable_name    | Value         |
			+------------------+---------------+
			| general_log      | OFF           |
			| general_log_file | localhost.log |
			| log_output       | FILE          |
			+------------------+---------------+
			
	3)二进制日志(非常重要)
		1》用于记录引起数据改变或存在引起数据改变的潜在可能性的语句(statement)或改变后的结果(row),也可能是二者混合。
		2》包含了所有更新了的数据或者已经潜在更新了数据的所有语句,记录了数据的更改以及数据更改的事件events和位置position。
		3》主要目的是在恢复时能够最大可能地恢复数据库,默认开启的。
		4》修改主配置文件my.cnf。
			log_bin=/path/to/bin_log_file:
				这是个只读变量,表明存放日志的目录位置,不能在此处写on或off,若不指定路径会存储在数据目录下。
			max_binlog_size=1073741824:
				设置单个二进制文件的最大尺寸,以字节为单位,超过此值大小就会自动滚动。
			sync_binlog={1|0|N}:
				表示每几次事务提交后是否立即将内存中的二进制日志同步到内存(binlog_cache)中。
				1表示立即提交;0则不提交;N可为任意值,表示每N次;值不同对应的性能也不同,0和1的性能差别可高达5倍之多。写入磁盘的操作是使用fdatasync()函数。
			binlog_format={statement|row|mixed}:
				binlog日志存放的格式
			expire_logs_days=N:
				二进制日志的有效天数
		5》功用:重放
		6》相关说明
			binlog_format={statement|row|mixed}
				statement:语句,记录了多数据库作出修改的语句;
				row:行,记录 了对 数据库作出修改的语句所影响到的数据行以及这些行的修改;
				mixed:混编,混合上述两种模式;
			sql_log_bin={on|off} 
				控制某会话中的“写”操作语句是否会被记录于日志文件中
				是个会话级别的变量,只能在当前会话中使用set命令来进行设置session.sql_log_bin={on|off}
				不能配置在my.cnf文件中
		7》可以用mysqlbinlog命令查看二进制日志文件。
			mysqlbinlog:
				 yyyy-mm-dd hh:mm:ss
				 --start-datetime=
				 --stop-datetime=
				 -j, --start-position=#
				  --stop-position=#
				  --user, --host, --password
		8》在mysql中查看二进制
			查看二进制日志文件列表:
				 mysql> show master|binary logs; 
			查看当前正在使用的二进制日志文件:
				mysql> show master status;
			查看二进制日志文件中的事件:
				mysql> show binlog events [in 'log_name'] [from pos] [limit [offset,] row_count]
			查看二进制日志的参数配置
				MariaDB [(none)]> show global variables where variable_name like '%log_bin%' or variable_name like '%binlog%';
				+-----------------------------------------+----------------------+
				| Variable_name                           | Value                |
				+-----------------------------------------+----------------------+
				| binlog_annotate_row_events              | OFF                  |
				| binlog_cache_size                       | 32768                |
				| binlog_checksum                         | NONE                 |
				| binlog_direct_non_transactional_updates | OFF                  |
				| binlog_format                           | STATEMENT            |
				| binlog_optimize_thread_scheduling       | ON                   |
				| binlog_stmt_cache_size                  | 32768                |
				| innodb_locks_unsafe_for_binlog          | OFF                  |
				| log_bin                                 | ON                   |
				| log_bin_trust_function_creators         | OFF                  |
				| max_binlog_cache_size                   | 18446744073709547520 |
				| max_binlog_size                         | 1073741824           |
				| max_binlog_stmt_cache_size              | 18446744073709547520 |
				| sql_log_bin                             | ON                   |
				| sync_binlog                             | 0                    |
				+-----------------------------------------+----------------------+
			日志滚动,单个二进制达到指定大小时会滚动,重启mysql后也会自动滚动,也可以进行手动滚动。
			手动滚动二进制日志
				MariaDB [(none)]>flush logs
		9》清除二进制日志
			清除所有日志(不存在主从复制关系)
				mysql> reset master;
			清除指定日志之前的所有日志
				mysql> purge master logs to '日志';
			清除某一时间点前的所有日志
				mysql> purge master logs before '年-月-日 时:分:秒';
			清除 n 天前的所有日志
				mysql> purge master logs before current_date - interval 10 day;
			由于二进制日志的重要性,请仅在确定不再需要将要被删除的二进制文件,
			或者在已经对二进制日志文件进行归档备份,
			或者已经进行数据库备份的情况下,才进行删除操作,且不要使用 rm 命令删除。
			
		10》二进制日志事件格式:
			# at 553
			#160831  9:56:08 server id 1  end_log_pos 624   query   thread_id=2     exec_time=0     error_code=0
			set timestamp=1472608568/*!*/;
			begin
			/*!*/;
			事件的起始位置:# at 553
			事件发生的日期时间:#160831  9:56:08
			事件发生的服务器id:server id 1
			事件的结束位置:end_log_pos 624
			事件的类型:query
			事件发生时所在服务器执行此事件的线程的id: thread_id=2 
			语句的时间戳与将其写入二进制日志文件中的时间差:exec_time=0
			错误代码:error_code=0
			设定事件发生时的时间戳:set timestamp=1472608568/*!*/;
			事件内容:begin
		
	4)慢速查询日志
		记录所有执行时间超过long_query_time秒的sql语句,可用于找到执行时间长的查询,以用于优化。
		默认未开启,开启优先级比查询日志高,默认是超过10秒的才会被记录。
		存储位置:文件,表(table,mysql.slog_log)
		修改主配置文件/etc/my.cnf,在[mysqld]下添加“long_query_time”和“log-slow-queries=文件路径名”,重启mysqld服务。
			log_slow_queries={on|off}:是否开启慢查询日志(5.5以前)
			slow_query_log={on|off}:是否开启慢查询日志(和上面没有区别,5.6以后)
			slow_query_log_file=xxxx-slom.log:慢查询日志存放位置,默认为“主机名-slow.log”。相对路径的话,默认为数据目录下。
			log_output={file|table|file,table|none}:表示存放日志的方式
			log_query_time=N :表示多长时间的查询被认为慢查询,默认为10秒。
			log_queries_not_using_indexes={on|off} :表示运行的sql语句没有使用到索引,是否也被当作慢查询语句记录。
			log_throttle_queries_not_using_indexes={on|off}:5.6.5引入的,没哟使用索引的查询语句是否胡被当作慢查询语句记录到慢查询日志中。
			log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
			log_slow_rate_limit
			log_slow_verbosity
		在mysql服务器上查看慢查询的参数
			MariaDB [(none)]>show global variables where variable_name like '%slow_query%' or variable_name='log_output' or variable_name='long_query_time' or variable_name like 'log_slow%';
		
		mysql自带了对慢查询日志的统计分析工具:mysqldumpslow
		
	5)中继日志:
		中继日志用于主从复制架构中的从服务器上,从服务器的 slave 进程从主服务器处获取二进制日志的内容并写入中继日志,然后由 I/O 进程读取并执行中继日志中的语句。
		
	6)事务(重做)日志:
		1》事务型存储引擎innodb用于保证事务特性的日志文件,redo log 和undo log 
		2》出于性能和故障恢复的考虑,MySQL 服务器不会立即执行事务,而是先将事务记录在日志里面,这样可以将随机I/O转换成顺序I/O,从而提高I/O性能。
		3》事物日志默认情况下会有两个文件,名称分别为ib_logfile0和ib_logfile1。当其中一个写满时,MySQL会将事务日志写入另一个日志文件(先清空原有内容)。
		4》当 MySQL 从崩溃中恢复时,会读取事务日志,将其中已经 commit 的事务写入数据库,没有 commit 的事务 rollback 。
		5》在事物提交时,innodb是否将缓冲到文件中同步,只要提交则立刻同步,同时又不会保证每个语句都同步,因此性能不会有特别大的影响
		6》mysql中显示事务日志的相关参数
			MariaDB [(none)]> show global variables where variable_name like '%innodb_log%' or variable_name like 'innodb_%_log%' or variable_name like 'innodb_locks%';
			+-------------------------------------------+---------+
			| Variable_name                             | Value   |
			+-------------------------------------------+---------+
			| innodb_flush_log_at_trx_commit            | 1       |
			| innodb_locks_unsafe_for_binlog            | OFF     |
			| innodb_log_block_size                     | 512     |
			| innodb_log_buffer_size                    | 8388608 |
			| innodb_log_file_size                      | 5242880 |
			| innodb_log_files_in_group                 | 2       |
			| innodb_log_group_home_dir                 | ./      |
			| innodb_mirrored_log_groups                | 1       |
			| innodb_recovery_update_relay_log          | OFF     |
			| innodb_use_global_flush_log_at_trx_commit | ON      |
			+-------------------------------------------+---------+
			
			如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。
				该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。 
			如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去. 
			如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。
				该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
				
			定义内存空间的大小,万一都写在buffer里面,如果进程崩溃,也会丢失事物,因此避免这种情况,一旦事物提交了,那么需要立即同步到磁盘中,而不是间断同步,所以有参数:
				|innodb_log_buffer_size                   |8388608               |
			每个日志的单位大小为5MB,如果有些大数据的话,则需要将其调大,否则恢复起来会比较慢,但是太大了也会导致恢复比较慢
				|innodb_log_file_size                  |5242880             |
			在每个组里面提供2个文件,上面有提到过
				|innodb_log_files_in_group               |2                |
			定义事物日志组的位置,一般来讲会有2个日志,一个写满后会重建立文件(达到轮询功能,写满后会同步到磁盘并将其清空)。
			一般来讲,日志文件大小是固定的,凡是mysql已启动的日志空间会在磁盘上立即分配,因为他们的主要功能是将随机I/O转为顺序I/O ,默认大小是每个文件为5MB,明确说明事物日志的路径保存在./ 表示在当前路径下
				|innodb_log_group_home_dir              |./               |
			同一个日志文件对日志组做镜像,当然,需要存放在不同的磁盘上
				|innodb_mirrored_log_groups                |1                 |
posted @ 2018-02-25 17:04  shenxm  阅读(7278)  评论(0编辑  收藏  举报