• MySQl创建用户和授权,mysquldump


    最高权限管理者是root用户,它拥有着最高的权限操作。包括select、update、delete、update、grant等操作。那么一般情况在公司之后DBA工程师会创建一个用户和密码,去连接数据库的操作,并给当前的用户设置某个操作的权限(或者所有权限)。那么这时就需要来简单了解一下:

    • 如何创建用户和密码

    • 给当前的用户授权

    • 移除当前用户的权限

      如果想创建一个新的用户,则需要以下操作:

      

    1.进入到mysql数据库下

    mysql> use mysql
    Database changed

    2.对新用户增删改

    1.创建用户:
    # 指定ip:192.118.1.1的hao用户登录
    create user 'hao'@'192.118.1.1' identified by '123';
    # 指定ip:192.118.1.开头的hao用户登录
    create user 'hao'@'192.118.1.%' identified by '123';
    # 指定任何ip的hao用户登录
    create user 'hao'@'%' identified by '123';
    
    2.删除用户
    drop user '用户名'@'IP地址';
    
    3.修改用户
    rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
    
    4.修改密码
    set password for '用户名'@'IP地址'=Password('新密码');

    3.对当前的用户授权管理

    #查看权限
    show grants for '用户'@'IP地址'
    
    #授权 hao用户仅对db1.t1文件有查询、插入和更新的操作
    grant select ,insert,update on db1.t1 to "hao"@'%';
    
    # 表示有所有的权限,除了grant这个命令,这个命令是root才有的。hao用户对db1下的t1文件有任意操作
    grant all privileges  on db1.t1 to "hao"@'%';
    #hao用户对db1数据库中的文件执行任何操作
    grant all privileges  on db1.* to "hao"@'%';
    #hao用户对所有数据库中文件有任何操作
    grant all privileges  on *.*  to "hao"@'%';
     
    #取消权限
     
    # 取消hao用户对db1的t1文件的任意操作
    revoke all on db1.t1 from 'hao'@"%";  
    
    # 取消来自远程服务器的hao用户对数据库db1的所有表的所有权限
    
    revoke all on db1.* from 'hao'@"%";  
    
    取消来自远程服务器的hao用户所有数据库的所有的表的权限
    revoke all privileges on *.* from 'hao'@'%';

    一 mysqldump指令实现数据备份、mysql指令实现数据还原

     DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理和维护数据库管理系统(DBMS)的相关工作人员的统称,属于运维工程师的一个分支,主要负责业务数据库从设计、测试到部署交付的全生命周期管理。DBA的核心目标是保证数据库管理系统的稳定性、安全性、完整性和高性能。

      百科出来的内容总是那么的专业,让人看完之后的感觉是很解释的很好,我认为,DBA主要做三件事情:1.保证公司的数据不丢失不损坏 2.提高数据库管理系统的工作性能

      对于现在的公司来讲,数据变得尤为重要,可以说最重要,你的网站可以无法访问,服务器可以宕机,但是数据绝对不能丢。

    备份表: 备份其中的某个表: 语法:mysqldump -u 用户名 -p 库名 表名> (路径)备份的文件名 mysqldump -uroot -p crm2 student> f:数据库备份练习crm2_table_student.sql

    单纯进行表备份的时候,就不用写-B参数了,因为库crm2后面就是student表了,也就是说crm2库还在呢

    备份多个表: 语法:mysqldump -u 用户名 -p 库名 表名1 表名2> (路径)备份的文件名

    和多个库一起备份有一个同样的问题,就是如果只需要恢复某一张表怎么办,上面的多表备份是不是也不太合适,所以又要进行分表备份 又是同样的套路,获取所有的表名,写一个循环脚本,执行单表备份的指令。 分库分表备份有些缺点:文件多,很碎,数据量非常大的时候,效率低 1.做一个完整的全备,再做一个分库分表的备份 2.脚本批量恢复多个sql文件。 备份数据库表结构: 利用mysqldump -d参数只备份表的结果,例如:备份crm2库的所有表的结构:

    C:WINDOWSsystem32>mysqldump -uroot -p -B -d crm2> f:数据库备份练习crm2stru.sql Enter password: ***

    备份出来的文件打开一看,就没有了插入数据的部分

    mysqldump的关键参数说明:       1.-B指定多个库,增加建库语句和use 语句       2.--compact 去掉注释,适合调试输出,生产上不用       3.-A或者--all-databases 例如:C:WINDOWSsystem32>mysqldump -uroot -p -B -A> f:数据库备份练习all.sql Enter password: ***

          4.-F刷新binlog日志       5.--master-data 增加binlog日志文件名及对应的为支点。       6.-x,--lock-all-tables 将所有的表锁住,一般mysql引擎都是锁表,全部都不能使用了,所有不太友好

          7.--add-locks这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作(mysql默认是加上的)       8.-l,--lock-tables Lock all tables for read       9.-d 只备份表结构       10.-t 只备份数据

    1. --single-transaction 开启事务,适合innodb事务数据库备份,InnoDB表在备份时,通常启用选项--single-transaction来保证备份的一致性,实际上工作原理时设定本次会话的隔离界别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了数据。

            MyISAM全库备份指令推荐:(gzip是压缩文件为zip类型的)         mysqldump -uroot -p666 -A -B --master-data=2 -x|gzip>f:数据库备份练习all.sql.gz         InnoDB全库备份指令推荐:         mysqldump -uroot -p666 -A -B --master-data=2 --single-transaction|gzip>f:数据库备份练习all.sql.gz

        数据恢复:

      一、通过source命令恢复数据库     进入mysql数据库控制台,mysql -uroot -p666登陆后     mysql>use 数据库;     然后使用source命令,后面参数为脚本文件(如这里用到的是.sql文件,如果你备份的是.txt文件,那这里写.txt文件)

        mysql>source crm2.sql #这个文件是系统路径下的,默认是登陆mysql前的系统路径,在mysql中查看系统路径的方法是通过system+系统命令来搞的     mysql>system ls   二、利用mysql命名恢复(标准)     mysql -root -p666 -e "use crm2;drop table student;show tables;" 必须是双引号     mysql -uroot -p666 crm2<f:数据库备份练习crm2.sql     mysql -uroot -p666 -e "use crm2;show tables;"

        注:如果sql文件里面没有use db这样的字样时,在导入时就要指定数据库名了。

        mysql -uroot -p666 crm2<.sql文件

        建议备份数据库时都指定上-B参数,效果好

        说明:mysql不光可以恢复mysqldump的备份,只要文件中是sql语句,都可以通过mysql命令执行到数据库中

        mysql 带-e参数实现非交互式对话,就是不需要到mysql里面去,在外面执行里面的指令的方法,例如:mysql -uroot -p666 -e "use crm2;show tables;",但是语句必须是双引号包裹。

        批量恢复库:找到所有的数据库名,然后通过库名去循环恢复

    二 MySQL数据备份

    #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境。但不能恢复到异构系统中如Windows。
    #2. 逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。
    #3. 导出表: 将表导入到文本文件中。 

    一、使用mysqldump实现逻辑备份

    #语法:
    # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
    
    #示例:
    #单库备份
    mysqldump -uroot -p123 db1 > db1.sql
    mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
    
    #多库备份
    mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
    
    #备份所有库
    mysqldump -uroot -p123 --all-databases > all.sql 

    二、恢复逻辑备份

    #方法一:
    [root@localhost backup]# mysql -uroot -p123 < /backup/all.sql
    
    #方法二:
    mysql> use db1;
    mysql> SET SQL_LOG_BIN=0;
    mysql> source /root/db1.sql
    
    #注:如果备份/恢复单个库时,可以修改sql文件
    DROP database if exists school;
    create database school;
    use school; 

    三、备份/恢复案例

    #数据库备份/恢复实验一:数据库损坏
    备份:
    1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
    2. # mysql -uroot -p123 -e 'flush logs' //截断并产生新的binlog
    3. 插入数据 //模拟服务器正常运行
    4. mysql> set sql_log_bin=0; //模拟服务器损坏
    mysql> drop database db;
    
    恢复:
    1. # mysqlbinlog 最后一个binlog > /backup/last_bin.log
    2. mysql> set sql_log_bin=0; 
    mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份 
    mysql> source /backup/last_bin.log //恢复最后个binlog文件
    
    
    #数据库备份/恢复实验二:如果有误删除
    备份:
    1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
    2. mysql -uroot -p123 -e 'flush logs' //截断并产生新的binlog
    3. 插入数据 //模拟服务器正常运行
    4. drop table db1.t1 //模拟误删除
    5. 插入数据 //模拟服务器正常运行
    
    恢复:
    1. # mysqlbinlog 最后一个binlog --stop-position=260 > /tmp/1.sql 
    # mysqlbinlog 最后一个binlog --start-position=900 > /tmp/2.sql 
    2. mysql> set sql_log_bin=0; 
    mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份
    mysql> source /tmp/1.log //恢复最后个binlog文件
    mysql> source /tmp/2.log //恢复最后个binlog文件
    
    注意事项:
    1. 完全恢复到一个干净的环境(例如新的数据库或删除原有的数据库)
    2. 恢复期间所有SQL语句不应该记录到binlog中

    四、实现自动化备份

    备份计划:
    1. 什么时间 2:00
    2. 对哪些数据库备份
    3. 备份文件放的位置
    
    备份脚本:
    [root@localhost~]# vim /mysql_back.sql
    #!/bin/bash
    back_dir=/backup
    back_file=`date +%F`_all.sql
    user=root
    pass=123
    
    if [ ! -d /backup ];then
    mkdir -p /backup
    fi
    
    # 备份并截断日志
    mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file}
    mysql -u${user} -p${pass} -e 'flush logs'
    
    # 只保留最近一周的备份
    cd $back_dir
    find . -mtime +7 -exec rm -rf {} ;
    
    手动测试:
    [root@localhost ~]# chmod a+x /mysql_back.sql 
    [root@localhost ~]# chattr +i /mysql_back.sql
    [root@localhost ~]# /mysql_back.sql
    
    配置cron:
    [root@localhost ~]# crontab -l
    2 * * * /mysql_back.sql

    五、表的导出和导入

    SELECT... INTO OUTFILE 导出文本文件
    示例:
    mysql> SELECT * FROM school.student1
    INTO OUTFILE 'student1.txt'
    FIELDS TERMINATED BY ',' //定义字段分隔符
    OPTIONALLY ENCLOSED BY '' //定义字符串使用什么符号括起来
    LINES TERMINATED BY '
    ' ; //定义换行符
    
    mysql 命令导出文本文件
    示例:
    # mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt
    # mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml
    # mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html
    
    LOAD DATA INFILE 导入文本文件
    mysql> DELETE FROM student1;
    mysql> LOAD DATA INFILE '/tmp/student1.txt'
    INTO TABLE school.student1
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY ''
    LINES TERMINATED BY '
    ';
    #可能会报错
    mysql> select * from db1.emp into outfile 'C:\db1.emp.txt' fields terminated by ',' lines terminated by '
    ';
    ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable
    
    
    #数据库最关键的是数据,一旦数据库权限泄露,那么通过上述语句就可以轻松将数据导出到文件中然后下载拿走,因而mysql对此作了限制,只能将文件导出到指定目录
    在配置文件中
    [mysqld]
    secure_file_priv='C:\' #只能将数据导出到C:\下
    
    重启mysql
    重新执行上述语句

    六、数据库迁移

    务必保证在相同版本之间迁移
    # mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目标IP -uroot -p456
  • 相关阅读:
    (转) CS0234: 命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Ajax”(是否缺少程序集引用?)
    服务器修改密码后,发布的网站报“500内部服务器错误”
    关于“/”应用程序中的服务器错误 之解决方案
    (转)根据IP返回对应的位置信息
    (转)C# DateTime格式化大全
    线包字效果
    (转)VS2012网站发布详细步骤
    HTML5 为什么这么火?
    百度地图下拉框搜索建议,并自动添加标注点
    js中检查时间段列表是否有交叉
  • 原文地址:https://www.cnblogs.com/sundawei7/p/11479401.html
Copyright © 2020-2023  润新知