首页> 搜索结果页
"mysql数据库删除怎么还原" 检索
共 142 条结果
Mysql5.7—运维常用备份方式(超全)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xsboke.blog.51cto.com/12096269/1925641    小生博客:http://xsboke.blog.51cto.com    小生 Q Q:1770058260                                   -------谢谢您的参考,如有疑问,欢迎交流 一、 Mysqldump备份结合binlog日志恢复 使用mysqldump进行全库备份,并使用binlog日志备份,还原时,可以使用binlog日志恢复到备份前的任意位置或时间   1. Binlog简介 主要用于主从复制和恢复数据库,使用mysqlbinlog命令查看binlog二进制日志文件 下面我们通过一个实例,演示,binlog是怎么恢复到某个时间点的 重启mysql服务使配置生效 验证binlog是否开启成功 创建测试使用的数据库和表并插入数据 为了方便实验,我们将有误操作的记录,放到一个新的binlog日志文件中 现在发现删除zhangsan是误操作,现在需要将zhangsan恢复 ,去查看binlog日志文件,根据位置实现将表还原到没有删除zhangsan时,然后跳过删除zhangsan的位置,恢复tom 可以做一个分析图,用来分析出,恢复时指定的区号 从此图可以分析出,mysql-bin.00001文件全部恢复即可, Mysql-bin.00002的219-416区是不需要恢复的 下面开始模拟 首先根据需求导出部分binlog日志 模拟删除数据库 通过binlog日志恢复 验证   2. Mysqldump简介 mysqldump是mysql用于备份和数据转移的一个工具; 将sql语句封装到文件,文件包含所有重建你的数据库所需要的 SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等,可以用来实现轻量级的快速迁移或恢复数据库 mysqldump 是将数据表导成 SQL 脚本文件,可以在不同的 MySQL 版本之间使用 mysqldump用于数据量很小的备份(大概几个G),当数据量大的时候不建议使用 导出对象:单个表、多个表、单个数据库、多个数据库、所有数据库    1) 示例      导出指定数据库或单个表                  导出多个数据库            导出所有            完整备份数据库并重新开启一个新binlog            导入          2)Mysqldump备份方案     周日凌晨1点全库备份;      周一到周六凌晨每隔4个小时增量备份一次;      设置crontab任务,每天执行备份脚本;      首先设置cronta任务            编辑mysqlfullbackup脚本            编辑mysqldailybackup.sh脚本内容       二、 Xtrabackup备份工具   1. Xtrabackup简介 Xtrabackup属于物理备份,支持物理热备,开源,性能比ibbackup强 Xtrabackup支持增量备份、完整备份、差异备份,与binlog日志组合 Xtrabackup提供两个命令行工具: Xtrabackup:可以备份innodb和xtraDB存储引擎的表 Innobackupex:支持备份innodb和myisam表的存储引擎,使用perl语言编写,执行过程中会执行一个读锁   2. 注意事项 因为xtrabackup属于物理热备,所以在备份的时候可能出现已经提交但是没有将数据写入数据文件或没有提交的事务,所以在恢复时需要解决这个问题,使用—applog-log参数可以将已经备份的数据中已提交的数据写入数据文件,未提交的数据全部回滚,以保证数据的唯一性 数据恢复时需要删除data下的所有文件 还原后,需要设置恢复文件的属主属组,mysql才能正常运行   3. Xtrabakup的优点 备份速度快,可以用于较大的数据库,弥补mysqldump的部分不足 支持热备份,备份过程不打断事务的执行 支持压缩备份节约磁盘空间和流量 自动实现备份检验 还原速度快   4. Xtrabackup安装 首先下载xtrabackup并且进行安装 Wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz                安装相关插件        安装percona-toolkit Wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm   5. Xtrabackup+binkog    Xtrabackup+binlog可以实现时间点还原    1)首先创建备份目录          2)注意开启binlog日志          3)执行完整备份(使用xtrabackup的“流”及“压缩备份”功能)          4)查看备份       5)在生产环境中,还会备份binlog日志 可以使用—start-position和—stop-position以跳过误删除的位置,去备份binlog日志,这里不再演示 6)Xtrabackup还原  还原前需要解决数据一致性的问题          开始还原          为还原的文件设置属主属组               最后如果需要恢复到某个时间点,可以利用备份的binlog日志文件恢复   6. 在生产环境中使用的备份用户可能不是root,这时需要注意权限了     本文出自 “小生blog” 博客,请务必保留此出处http://xsboke.blog.51cto.com/12096269/1925641
文章
存储  ·  运维  ·  监控  ·  关系型数据库  ·  数据库
1970-01-01
Mysql5.7—运维常用备份方式(超全)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xsboke.blog.51cto.com/12096269/1925641    小生博客:http://xsboke.blog.51cto.com    小生 Q Q:1770058260                                   -------谢谢您的参考,如有疑问,欢迎交流 一、 Mysqldump备份结合binlog日志恢复 使用mysqldump进行全库备份,并使用binlog日志备份,还原时,可以使用binlog日志恢复到备份前的任意位置或时间   1. Binlog简介 主要用于主从复制和恢复数据库,使用mysqlbinlog命令查看binlog二进制日志文件 下面我们通过一个实例,演示,binlog是怎么恢复到某个时间点的 重启mysql服务使配置生效 验证binlog是否开启成功 创建测试使用的数据库和表并插入数据 为了方便实验,我们将有误操作的记录,放到一个新的binlog日志文件中 现在发现删除zhangsan是误操作,现在需要将zhangsan恢复 ,去查看binlog日志文件,根据位置实现将表还原到没有删除zhangsan时,然后跳过删除zhangsan的位置,恢复tom 可以做一个分析图,用来分析出,恢复时指定的区号 从此图可以分析出,mysql-bin.00001文件全部恢复即可, Mysql-bin.00002的219-416区是不需要恢复的 下面开始模拟 首先根据需求导出部分binlog日志 模拟删除数据库 通过binlog日志恢复 验证   2. Mysqldump简介 mysqldump是mysql用于备份和数据转移的一个工具; 将sql语句封装到文件,文件包含所有重建你的数据库所需要的 SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等,可以用来实现轻量级的快速迁移或恢复数据库 mysqldump 是将数据表导成 SQL 脚本文件,可以在不同的 MySQL 版本之间使用 mysqldump用于数据量很小的备份(大概几个G),当数据量大的时候不建议使用 导出对象:单个表、多个表、单个数据库、多个数据库、所有数据库    1) 示例      导出指定数据库或单个表                  导出多个数据库            导出所有            完整备份数据库并重新开启一个新binlog            导入          2)Mysqldump备份方案     周日凌晨1点全库备份;      周一到周六凌晨每隔4个小时增量备份一次;      设置crontab任务,每天执行备份脚本;      首先设置cronta任务            编辑mysqlfullbackup脚本            编辑mysqldailybackup.sh脚本内容       二、 Xtrabackup备份工具   1. Xtrabackup简介 Xtrabackup属于物理备份,支持物理热备,开源,性能比ibbackup强 Xtrabackup支持增量备份、完整备份、差异备份,与binlog日志组合 Xtrabackup提供两个命令行工具: Xtrabackup:可以备份innodb和xtraDB存储引擎的表 Innobackupex:支持备份innodb和myisam表的存储引擎,使用perl语言编写,执行过程中会执行一个读锁   2. 注意事项 因为xtrabackup属于物理热备,所以在备份的时候可能出现已经提交但是没有将数据写入数据文件或没有提交的事务,所以在恢复时需要解决这个问题,使用—applog-log参数可以将已经备份的数据中已提交的数据写入数据文件,未提交的数据全部回滚,以保证数据的唯一性 数据恢复时需要删除data下的所有文件 还原后,需要设置恢复文件的属主属组,mysql才能正常运行   3. Xtrabakup的优点 备份速度快,可以用于较大的数据库,弥补mysqldump的部分不足 支持热备份,备份过程不打断事务的执行 支持压缩备份节约磁盘空间和流量 自动实现备份检验 还原速度快   4. Xtrabackup安装 首先下载xtrabackup并且进行安装 Wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz                安装相关插件        安装percona-toolkit Wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm   5. Xtrabackup+binkog    Xtrabackup+binlog可以实现时间点还原    1)首先创建备份目录          2)注意开启binlog日志          3)执行完整备份(使用xtrabackup的“流”及“压缩备份”功能)          4)查看备份       5)在生产环境中,还会备份binlog日志 可以使用—start-position和—stop-position以跳过误删除的位置,去备份binlog日志,这里不再演示 6)Xtrabackup还原  还原前需要解决数据一致性的问题          开始还原          为还原的文件设置属主属组               最后如果需要恢复到某个时间点,可以利用备份的binlog日志文件恢复   6. 在生产环境中使用的备份用户可能不是root,这时需要注意权限了     本文出自 “小生blog” 博客,请务必保留此出处http://xsboke.blog.51cto.com/12096269/1925641
文章
存储  ·  运维  ·  监控  ·  关系型数据库  ·  数据库
1970-01-01
RHEL 5服务篇—管理以及备份Mysql数据库系统
    上一遍文章中,我们已经学会了怎么安装Mysql数据了,那么我们怎么样管理以及使用Mysql呢?Mysql是一套数据库管理系统,在每一台Mysql服务器中,支持运行对个库,每个库相当于一个容器,其中存放着许许多多的表,表中的每一行包含一条具体的数据关系信息。 1、查看Mysql数据中的库和表 首先我们需要连接Mysql数据,只有连接了Mysql数据才可以查看里面的内容。 [root@localhost /]#mysql -u root -p Enter password: mysql> show databases语句:用于列出当前Mysql服务器中包含的库,默认有三个库:test,mysql和information_schema(其中mysql库中包含了用户认证相关的表) show tables语句:用于列出当前所在的库中的所有表,在操作之前需要先使用use语句切换到目标库。 describe语句:用于显示表的结构,及组成表的各字段的信息。需要指定“库名.表名”,若只需要指定表名,则需要使用use语句切换到指定的库。 2、创建及删除数据库和表 create database 语句:用于创建一个新的库,需要指定数据库名称作为参数。 Mysql数据库的数据文件默认存放在“/usr/lcoal/mysql/var/”目录下,每个数据库对应一个子目录,用于存储数据表文件。 create table语句:用于在当前库中创建新的表,需要指定数据名称作为参数,并指定该表所使用的各字段。 格式如:create    table    表名 (字段1名称 类型,字段2名称 类型,....,primapy(主键名)) 列如:创建一个users表,有用户名和密码两列,用户名不能超过16个字符串,密码不能超过48个字符串,将用户名的列设为主键,将密码列默认设为空值。 数据表文件存储在对应的数据库目录下,默认在”/usr/lcoal/mysql/var/bbs/”目录下,每个数据表对应为三个文件,后缀分别为“.frm“,”.MYD”,“.MYI“。 drop table语句:用于删除库中的表,需要指定“库名.表名“做为参数;若只指定表名,需要先进表所在的数据库。 drop database语句:用于删除指定的数据库,需要指定库名作为参数。 3、管理表中的数据记录 insert into 语句:用于向表中插入新的数据记录。 列如:向刚才新建表中插入一条新的记录。 在插入新的数据记录时,如果这条记录完整包括表中所有字段的值,则插入语句中指定的字段部分可以省略。 select 语句:用于从指定的表中查找符合条件的数据记录。 格式:select 字段1,字段2, ... from 表名 where 条件表达式 如果要实现多表查询,则这些表之间一定要有关联(两张表中有相同的列),否则不可实现多表查询。 update 语句:用于修改,更新表中的数据记录。 在Mysql数据库中,数据用户的信息都保存在Mysql库中的user表中,我们可以通过修改user表中的记录来更改用户的信息。列如:将Mysql的管理员密码改掉。 delete 语句:用于删除表中指定的数据记录。 列如:删除bbs数据库中users表中lisi的记录。 管理Mysql数据库的用户,以及用户授权 grant 语句:专门用来设置数据库用户的访问权限。当指定的用户名不存在时,grant语句将会创建新的用户,否则grant语句用于修改用户的信息。 格式:grant 权限列表 on 库名.表名 to 用户名@来源地址 [ identified by ‘ 密码’ ] 权限类表:用于列出授权使用的各种数据库操作,以逗号进行分隔,all表示所有权限。 库名.表名:用于指定受权限操作的库和表的名称,可以使用”*“通配符。 用户名@来源地址:用于指定用户名和允许访问的地址,来源地址可以是域名,IP,还可以使用”%“通配符表示某个区域或网段。列如:”%.benet.com“、”192.168.1.%“等 列如:创建一个blog用户对于bbs数据库的所有访问权限。 show grants for语句:专门用来查看数据库用户的授权信息,通过for子句可指定查看的用户对象(必须与授权时使用的对象名称一致)。 格式:show grants for 用户名@来源地址 revoke 语句:用于撤销指定用户的数据库权限。 格式:revoke 权限列表 on 数据库名.表名 from 用户名@来源地址 Mysql数据库的备份与恢复 Mysql数据库的备份可以采用多种方式,列如直接打包数据库文件”/usr/lcoal/mysql/var/“,或者使用专用的导出工具Mysqldump来完成。下面我们就来使用专用的工具mysqldump工具来备份数据库。 备份数据库 通过mysqldump命令可以将指定的库,表或全部的库导出为sql脚本,便于该命令在不同版本的mysql服务器上使用。使用Mysqldump命令导出数据时,默认会在终端显示,若要保存到文件,还需要结合shell的”>“重定向输出操作。 备份表、格式:mysql [选项] 库名 [表名1] [表名2]  ... > /备份路径/备份文件名 备份库、格式:mysql [选项] --databases [表名1] [表名2] ... > /备份路径/备份文件名 备份所有库、格式:mysql [选项] --all-datebases  > /备份路径/备份文件名 常用的选项包括”-u“,”-p“,分别用于指定数据库用户名,密码。 列如:备份bbs数据库中users表 [root@localhost /]#mysqldump -u root -p bbs users > /tmp/users.sql Enter password:       //输入密码 列如:备份bbs数据库 [root@localhost /]#mysqldump -u root -p --databases bbs > /tmp/bbs.sql Enter password:       //输入密码 列如:备份整个Mysql中的所有数据库 [root@localhost /]#mysqldump -u root -p --opt --all-databases > /tmp/all-data.sql Enter password:       //输入密码 若备份整个Mysql数据库时,导出的数据量较大,可以添加”--opt“选项以优化执行速度。 恢复数据库 使用mysqldump命令导出的sql备份脚本,在需要恢复时可以通过mysql命令对其进行导入操作。 格式:mysql [选项] [库名] [表名] < /备份路径/备份文件名 当备份文件中只包含表的备份,而不包含创建库的语句时,则执行导入操作时必须制定库名。 列如:将刚才备份的users表恢复到指定的数据库中。 列如:备份bbs库中users表 [root@localhost /]#mysql -u root -p test < /tmp/users.sql Enter password:          //输入密码 若备份文件中已经包括完整的库信息,则执行导入操作时无需指定库名。 列如:将刚才备份的bbs数据库还原到数据库中(前提是需要将原有的bbs数据删掉,否则或重名)。 列如:备份bbs库中users表 [root@localhost /]#mysql -u root -p  > /tmp/bbs.sql Enter password:      //输入密码 掌握上述的各种Mysql管理语句命令,就可以管理基本的数据库工作。如果需要了解更多的Mysql命令,可以参考http://dev.mysql.com/doc/refman/5.1/zh/在线手册。 至此Mysql的基本管理已经讲解完毕了,如果有什么地方写的不是很好,希望大家多多指教,在下感激不尽。 本文转自yun5277 51CTO博客,原文链接:http://blog.51cto.com/dengqi/1215716,如需转载请自行联系原作者
文章
SQL  ·  关系型数据库  ·  MySQL  ·  数据库  ·  数据安全/隐私保护  ·  容器  ·  文件存储  ·  Shell  ·  存储  ·  数据库管理
2017-11-15
MySQL 常用命令大全
1.mysql:连接数据库 mysql 命令用户连接数据库。 mysql 命令格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1)  连接到本机上的 MYSQL 命令 mysql -u root -p,回车后提示你 输密码。 注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。 如果刚安装好 MYSQL,超级用户 root 是没有密码的,故直接回车即可进入到 MYSQL 中了, MYSQL 的提示符是: mysql> 2)  连接到远程主机上的 MYSQL 假设远程主机的 IP 为:110.110.110.110,用户名为 root,密码为 abcd123。则键入以下命令:  mysql -h110.110.110.110 -u root -p 123;(注:u 与 root 之间可以不用加空格,其它也一样) 3)  退出 MYSQL 命令 exit  (回车) 2.mysqladmin:修改用户密码 mysqladmin 命令用于修改用户密码。 mysqladmin 命令格式:mysqladmin -u  用户名 -p  旧密码 password 新密码 1)  给 root 加个密码 ab12 命令:   mysqladmin -u root -password ab12 注:因为开始时 root 没有密码,所以-p 旧密码一项就可以省略了。 2) 再将 root 的密码改为 djg345   mysqladmin -u root -p ab12 password djg345 3.grant on:新增用户 grant on 命令用于增加新用户并控制其权限。       grant on 命令格式:grant select on  数据库.* to  用户名@登录主机 identified by “密码”; 1) 增加一个用户 test1,密码为 abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用 root 用户连入 MYSQL,然后键入以下命令:   grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”; 但增加的用户是十分危险的,你想如某个人知道 test1 的密码,那么他就可以在 internet 上的任何一台电脑上登录你的 mysql 数据库并对你的数据可以为所欲为了,解决办法如下。 2) 增加一个用户 test2 密码为 abc,让他只可以在 localhost 上登录,并可以对数据库 mydb 进行查询、插入、修改、删除的操作(localhost 指本地主机,即 MYSQL 数据库所在的那台主机),这样用户即使用知道 test2  的密码,他也无法从 internet  上直接访问数据库,只能通过 MYSQL 主机上的 web 页来访问了。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”; 如果你不想 test2 有密码,可以再打一个命令将密码消掉。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”; 4.create:创建数据库 create 命令用于创建数据库。 create 命令格式:create database <数据库名>; 注意:创建数据库之前要先连接 Mysql 服务器。 1)  建立一个名为 xhkdb 的数据库:   mysql> create database xhkdb; 2) 创建数据库并分配用户: a:create database  数据库名; b:grant select,insert,update,delete,create,drop,alter  on   数据库名.* to  数据库名@localhost  identified by  '密码'; c:  set password for '数据库名'@'localhost' = OLD_PASSWORD('密码'); 依次执行 3 个命令完成数据库创建。 注意:中文 “密码”和“数据库”是户自己需要设置的。 5.show databases:显示数据库 show databases 命令用于显示所有数据库列表。 show databases 命令格式:show databases; (注意:最后有个 s)  例如:mysql> show databases; 6.drop database:删除数据库 drop 命令用于删除数据库。 drop 命令格式:drop database <数据库名>; 例如,删除名为 xhkdb 的数据库:   mysql> drop database xhkdb; [例子 1] 删除一个已经确定存在的数据库: mysql> drop database drop_database; Query OK, 0 rows affected (0.00 sec) [例子 2] 删除一个不确定存在的数据库: mysql> drop database drop_database; ERROR 1008 (HY000): Can't drop database 'drop_database'; database doesn't exist // 发生错误,不能删除'drop_database'数据库,该数据库不存在。 mysql> drop database if exists drop_database;  Query OK, 0 rows affected, 1 warning (0.00 sec) //产生一个警告说明此数据库不存在 mysql> create database drop_database;    // 创建一个数据库 Query OK, 1 row affected (0.00 sec) mysql> drop database if exists drop_database;    // if exists 判断数据库是否存在,不存在也不产生错误 Query OK, 0 rows affected (0.00 sec) 7.use:使用数据库 use 命令可以让我们来使用数据库。 use 命令格式: use <数据库名>; 例如,如果 xhkdb 数据库存在,尝试存取它:   mysql> use xhkdb; 屏幕提示:Database changed 1) use 语句可以通告 MySQL 把 db_name 数据库作为默认(当前)数据库使用,用于后续语句。该数据库保持为默认数据库,直到语段的结尾,或者直到出现下一个不同的 use 语句: mysql> USE db1; mysql> SELECT COUNT(*) FROM mytable;     # selects from db1.mytable mysql> USE db2; mysql> SELECT COUNT(*) FROM mytable;      # selects from db2.mytable 2)  使用 USE 语句为一个特定的当前的数据库做标记,不会阻碍您访问其它数据库中的表。下 面的例子可以从 db1 数据库访问 author 表,并从 db2 数据库访问 editor 表: mysql> USE db1; mysql> SELECT author_name,editor_name FROM author,db2.editor -> WHERE author.editor_id = db2.editor.editor_id; use 语句被设立出来,用于与 Sybase 相兼容。 有些网友问到,连接以后怎么退出。其实,不用退出来,use   数据库后,使用 show databases 就能查询所有数据库,如果想跳到其他数据库,用use  其他数据库名字就可以了。 8. select:当前连接的数据库 select 命令表示当前选择(连接)的数据库。 select 命令格式:mysql> select database(); MySQL 中 SELECT 命令类似于其他编程语言里的 print 或者 write,你可以用它来显示一个字符串、数字、数学表达式的结果等等。如何使用 MySQL 中 SELECT 命令的特殊功能呢? 显示 MYSQL 的版本 mysql> select version(); +-----------------------+ | version() | +-----------------------+ | 6.0.4-alpha-community | +-----------------------+ 1 row in set (0.02 sec) 2)  显示当前时间 mysql> select now(); +---------------------+ | now() | +---------------------+ | 2009-09-15 22:35:32 | +---------------------+ 1 row in set (0.04 sec) 3)  显示年月日 SELECT DAYOFMONTH(CURRENT_DATE); +--------------------------+ | DAYOFMONTH(CURRENT_DATE) | +--------------------------+ | 15 | +--------------------------+ 1 row in set (0.01 sec) SELECT MONTH(CURRENT_DATE); +---------------------+ | MONTH(CURRENT_DATE) | +---------------------+ | 9 | +---------------------+ 1 row in set (0.00 sec) SELECT YEAR(CURRENT_DATE); +--------------------+ | YEAR(CURRENT_DATE) | +--------------------+ | 2009 | +--------------------+ 1 row in set (0.00 sec) 4)  显示字符串 mysql> SELECT "welecome to my blog!"; +----------------------+ | welecome to my blog! | +----------------------+ | welecome to my blog! | +----------------------+ 1 row in set (0.00 sec) 5)  当计算器用 select ((4 * 4) / 10 ) + 25; +----------------------+ | ((4 * 4) / 10 ) + 25 | +----------------------+ | 26.60 | +----------------------+ 1 row in set (0.00 sec) 6)  串接字符串 select CONCAT(f_name, " ", l_name) AS Name from employee_data where title = 'Marketing Executive'; +---------------+ | Name | +---------------+ | Monica Sehgal | | Hal Simlai | | Joseph Irvine | +---------------+ 3 rows in set (0.00 sec) 注意:这里用到 CONCAT()函数,用来把字符串串接起来。另外,我们还用到以前学到的 AS 给结果列'CONCAT(f_name, " ", l_name)'起了个假名。 9. create table:创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库名>”指定操作是在哪个数据库中进行,如果没有选择数据库,会抛出“No database selected”的错误。 创建数据表的语句为 CREATE TABLE,语法规则如下: CREATE   TABLE <表名> ( 字段名 1,数据类型 [列级别约束条件] [默认值], 字段名 2,数据类型 [列级别约束条件] [默认值], [表级别约束条件] ); 使用 CREATE TABLE 创建表时,必须指定以下信息: (1)要创建的表的名称,不区分大小写,不能使用 SQL 语言中的关键字,如 DROP、ALTER、INSERT 等。 (2)数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。  创建员工表 tb_emp1,结构如下表所示。 表 tb_emp1 表结构 字段名称 数据类型 备注 id INT(11) 员工编号  deptId INT(11) 所在部门编号  FLOAT 工资 首先创建数据库,SQL 语句如下: 字段名称 数据类型  备注 id   INT(11) 员工编号 name  VARCHAR(25)  员工名称 deptId    INT(11) 所在部门编号 salary FLOAT 工资 表  tb_emp1 表结构 首先创建数据库,SQL 语句如下:   CREATE     DATABASE  test_db; 选择创建表的数据库,SQL 语句如下:   USE test_db; 创建 tb_emp1 表,SQL 语句为: CREATE TABLE tb_emp1 (     id  INT(11),     name  VARCHAR(25),     deptId  INT(11),      salary   FLOAT ); 语句执行后,便创建了一个名称为 tb_emp1 的数据表,使用 SHOW TABLES;语句查看数据表是否创建成功,SQL 语句如下: mysql> SHOW TABLES; +-----------------------+ | Tables_in_ test_db | +----------------------+ | tb_emp1 | +----------------------+ 1 row in set (0.00 sec) 可以看到,test_db 数据库中已经有了数据表 tb_tmp1,数据表创建成功。 10. desc:获取表结构 在 MySQL 中,查看表结构可以使用 DESCRIBE 和 SHOW CREATE TABLE 语句。 DESCRIBE/DESC 语句可以查看表的字段信息,其中包括:字段名、字段数据类型、是否为主键、是否有默认值等。语法规则如下:   DESCRIBE  表名; 或者简写为:   DESC  表名; SHOW CREATE TABLE 语句可以用来显示创建表时的 CREATE TABLE 语句,语法格式如下:   SHOW CREATE TABLE <表名\G>; 使用 SHOW CREATE TABLE 语句,不仅可以查看表创建时候的详细语句,而且还可以查看存储引擎和字符编码。 如果不加’\G’参数,显示的结果可能非常混乱,加上参数’\G’之后,可使显示结果更加直观, 易于查看。 使用 SHOW CREATE TABLE 查看表 tb_emp1 的详细信息,SQL 语句如下:   mysql> SHOW CREATE TABLE tb_emp1; 11.drop table:删除数据表 在 MySQL 中,使用 DROP TABLE 可以一次删除一个或多个没有被其他表关联的数据表。语法格式如下:   DROP TABLE [IF EXISTS]表 1, 表 2, . . .  表 n; 其中“表 n”指要删除的表的名称,后面可以同时删除多个表,只需将要删除的表名依次写在后面,相互之间用逗号隔开即可。如果要删除的数据表不存在,则 MySQL 会提示一条错误信息, “ERROR 1051 (42S02): Unknown table '表名'”。参数“IF EXISTS”用于在删除前判断删除的表是否存在,加上该参数后,再删除表的时候,如果表不存在,SQL 语句可以顺利执行,但是会发出警告(warning)。 在前面的例子中,已经创建了名为 tb_dept2 的数据表。如果没有,读者可输入语句,创建该表,SQL 语句如例 4.8 所示。下面使用删除语句将该表删除。 删除数据表 tb_dept2,SQL 语句如下:   DROP TABLE IF EXISTS tb_dept2; 12.insert into:向表中插入数据 INSERT INTO 语句用于向表格中插入新的行。 语法如下:   INSERT INTO  表名称 VALUES (值 1,  值 2,....) 我们也可以指定所要插入数据的列:   INSERT INTO table_name (列 1, 列 2,...) VALUES (值 1, 值 2,....) 【例】创建数据表 tmp3,定义数据类型为 YEAR 的字段 y,向表中插入值 2010,’2010’,SQL语句如下: 首先创建表 tmp3:   CREATE TABLE tmp3(    y YEAR ); 向表中插入数据:   mysql> INSERT INTO tmp3 values(2010),('2010'); 13.select from:查询表中数据 MySQL 从数据表中查询数据的基本语句为 SELECT 语句。SELECT 语句的基本格式是: SELECT {* | <字段列表>} [ FROM <表 1>,<表 2>... [WHERE <表达式> [GROUP BY <group by definition>] [HAVING <expression> [{<operator> <expression>}...]] [ORDER BY <order by definition>] [LIMIT [<offset>,] <row count>] ] SELECT [字段 1,字段 2,…,字段 n] FROM [表或视图] WHERE [查询条件]; 其中,各条子句的含义如下: {* | <字段列表>}包含星号通配符选字段列表,表示查询的字段,其中字段列至少包含一个字 段名称,如果要查询多个字段,多个字段之间用逗号隔开,最后一个字段后不要加逗号。 FROM <表 1>,<表 2>...,表 1 和表 2 表示查询数据的来源,可以是单个或者多个。 WHERE 子句是可选项,如果选择该项,将限定查询行必须满足的查询条件。 GROUP BY <字段>,该子句告诉 MySQL 如何显示查询出来的数据,并按照指定的字段分 组。 [ORDER BY <字段 >],该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行 的排序有:升序(ASC)、降序(DESC)。 [LIMIT [<offset>,] <row count>],该子句告诉 MySQL 每次显示查询出来的数据条数。 14.delete from:删除记录 从数据表中删除数据使用 DELETE  语句,DELETE  语句允许 WHERE 子句指定删除条件。 DELETE 语句基本语法格式如下:   DELETE FROM table_name [WHERE <condition>]; table_name 指定要执行删除操作的表;“[WHERE <condition>]”为可选参数,指定删除条件, 如果没有 WHERE 子句,DELETE 语句将删除表中的所有记录。 【例】在 person 表中,删除 id 等于 11 的记录,SQL 语句如下: mysql> DELETE FROM person WHERE id = 11; Query OK, 1 row affected (0.02 sec) 15.update set:修改表中的数据 MySQL 中使用 UPDATE 语句更新表中的记录,可以更新特定的行或者同时更新所有的行。  基本语法结构如下: UPDATE table_name SET column_name1 = value1,column_name2=value2,……,column_namen=valuen WHERE (condition); column_name1,column_name2,……,column_namen 为 指 定 更 新 的 字 段 的 名 称 ; value1, value2,……valuen 为相对应的指定字段的更新值;condition 指定更新的记录需要满足的条件。更新 多个列时,每个“列-值”对之间用逗号隔开,最后一列之后不需要逗号。 【例】在 person 表中,更新 id 值为 11 的记录,将 age 字段值改为 15,将 name 字段值改为 LiMing,SQL 语句如下:   UPDATE person SET age = 15, name=’LiMing’ WHERE id = 11; 16.alter add:增加字段 添加字段的语法格式如下: ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名]; 新字段名为需要添加的字段的名称;“FIRST”为可选参数,其作用是将新添加的字段设置为 表的第一个字段;“AFTER”为可选参数,其作用是将新添加的字段添加到指定的“已存在字段 名”的后面。 【例】在数据表 tb_dept1 中添加一个没有完整性约束的 INT 类型的字段 managerId(部门经理 编号),SQL 语句如下:   ALTER TABLE tb_dept1 ADD managerId INT(10); 17.rename:修改表名 MySQL 是通过 ALTER TABLE 语句来实现表名的修改的,具体的语法规则如下:   ALTER TABLE <旧表名> RENAME [TO] <新表名>; 其中 TO 为可选参数,使用与否均不影响结果。 【例】将数据表 tb_dept3 改名为 tb_deptment3,SQL 语句如下:   ALTER TABLE tb_dept3 RENAME tb_deptment3; 18.mysqldump:备份数据库 mysqldump 备份数据库语句的基本语法格式如下:   mysqldump    –u user –h host –ppassword dbname[tbname, [tbname...]]> filename.sql user 表示用户名称;host 表示登录用户的主机名称;password 为登录密码;dbname 为需要备 份的数据库名称;tbname 为 dbname 数据库中需要备份的数据表,可以指定多个需要备份的表;右 箭头符号“>”告诉 mysqldump 将备份数据表的定义和数据写入备份文件;filename.sql 为备份文件 的名称。 【例】使用 mysqldump 命令备份数据库中的所有表,执行过程如下: mysqldump -u root -p booksdb > /backup/booksdb_20130301.sql Enter password: ** 输入密码之后,MySQL 便对数据库进行了备份,在 \backup 文件夹下面查看刚才备份过的文件。 19.mysql 和 source:还原数据库 对于已经备份的包含 CREATE、INSERT 语句的文本文件,可以使用 mysql 命令导入到数据库 中。 备份的 sql 文件中包含 CREATE、INSERT 语句(有时也会有 DROP 语句)。mysql 命令可以 直接执行文件中的这些语句。其语法如下:   mysql –u user –p [dbname] < filename.sql user 是执行 backup.sql 中语句的用户名;-p 表示输入用户密码;dbname 是数据库名。如果 filename.sql 文件为 mysqldump 工具创建的包含创建数据库语句的文件,执行的时候不需要指定数 据库名。 【例 1】使用 mysql 命令将 \backup\booksdb_20130301.sql 文件中的备份导入到数据库中,输 入语句如下:   mysql –u root –p booksDB < /backup/booksdb_20130301.sql 执行该语句前,必须先在 MySQL 服务器中创建 booksDB 数据库,如果不存在恢复过程将会 出错。命令执行成功之后 booksdb_20130301.sql 文件中的语句就会在指定的数据库中恢复以前的表。 如果已经登录 MySQL 服务器,还可以使用 source 命令导入 sql 文件。source 语句语法如下:   source filename 【例 2 】 使 用 root  用 户 登 录 到 服 务 器 , 然 后 使 用 source  导 入 本 地 的 备 份 文 件 booksdb_20110101.sql,输入语句如下: --选择要恢复到的数据库 mysql> use booksDB; Database changed --使用 source 命令导入备份文件 mysql> source C:\backup\booksDB_20130301.sql 命令执行后,会列出备份文件 booksDB_20130301.sql 中每一条语句的执行结果。source 命令 执行成功后,booksDB_20130301.sql 中的语句会全部导入到现有数据库中。 20.mysqlhotcopy:快速恢复数据库 mysqlhotcopy 备份后的文件也可以用来恢复数据库,在 MySQL 服务器停止运行时,将备份的数据库文件复制到 MySQL 存放数据的位置(MySQL 的 data 文件夹),重新启动 MySQL 服务即 可。如果以根用户执行该操作,必须指定数据库文件的所有者,输入语句如下:   chown -R mysql.mysql /var/lib/mysql/dbname 【例】从 mysqlhotcopy 复制的备份恢复数据库,输入语句如下:   cp -R    /usr/backup/test usr/local/mysql/data 执行完该语句,重启服务器,MySQL 将恢复到备份状态。.sql      本文转自898009427 51CTO博客,原文链接:http://blog.51cto.com/moerjinrong/1891162,如需转载请自行联系原作者
文章
SQL  ·  关系型数据库  ·  MySQL  ·  数据库  ·  数据安全/隐私保护
2017-11-15
mysql5.7运维基础
1,mysql关闭的几种方法 mysqladmin -u root -p shutdown --mysqladmin关闭mysql /etc/init.d/mysqld stop --mysqld脚本关闭 systemctl stop mysqld --mysql脚本关闭 kill -9 进程 --先查看mysqld进程,但不推荐方法 2,mysql修改密码 1 alter user root@'localhost' identified by '654321'; flush privileges; 2 mysqladmin -u root -p password 123456 3 mysql> use mysql mysql> update mysql.user set authentication_string=password('6543216') where user='root';Query OK, 1 row affected, 1 warning (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 1 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 4 mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('7654321'); mysql> flush privileges; 忘记root密码,修root修改密码 /etc/init.d/mysqld stop --关闭mysql mysqld_safe --skip-grant-tables & --安全模式启动mysql> use mysqlmysql> update mysql.user set authentication_string=password('6543216') where user='root';Query OK, 1 row affected, 1 warning (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 1mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)/etc/init.d/mysqld restart --重启mysql mysql基础语法 1,mysql添加普通用户 mysql> create user 'test'@'localhost' identified by '123456'; mysql> flush privileges; 2 mysql> grant select on . to 'test2'@'localhost' identified by '654321'; mysql> flush privileges; 2 授权mysql用户和回收权限 mysql> grant select,insert on mydb.* to 'test'@'localhost'; mysql> show grants for 'test'@'localhost'; --查看权限mysql> revoke select on mydb.* from 'test'@'localhost'; --回收select权限mysql> flush privileges; 基础语句 create database mydb default charset utf8; --创建数据库 mysql> use mydb; --使用数据库mysql> create table emm(id int); --创建表mysql> insert into emm value(1); --插入数据mysql> select * from emm; --查看表中数据 mysql> update emm set id=2 where id=1; --更新数据mysql> show tables; --查看库中表mysql> desc emm; --查看表结构mysql> alter table emm add column age int after id; --添加一个字段mysql> show engines; --查看数据库支持的引擎mysql> show variables like '%char%'; --查看字符集mysql> show variables like '%max_con%'; --查看默认连接数mysql> show OPEN TABLES where In_use > 0; --查看正在使用的表mysql> SHOW ENGINE INNODB STATUS; --查看innodb日志mysql> drop table emm; --删除表mysql> delete from emm; --清除表数据,不清楚表空间mysql> truncate table emm; --清楚数据,清楚空间mysql> drop database mydb; --删除数据库 运维基础语法 设置慢查询日志 mysql> show variables like 'long%'; Variable_name Value long_query_time 10.000000 1 row in set (0.01 sec) mysql> show variables like 'slow%'; Variable_name Value slow_launch_time 2 slow_query_log OFF slow_query_log_file /usr/local/src/mysql/data/iZwz9hzc7pd8k6u859n9rzZ-slow.log 3 rows in set (0.00 sec) --查看慢查询日志是关闭的,如果是线上项目可以用语句设置开启,然后再my.cnf里面配置。 mysql> set global slow_query_log='ON'; Query OK, 0 rows affected (0.01 sec)mysql> set global long_query_time=3;Query OK, 0 rows affected (0.00 sec)修改/etc/my.cnfslow_query_log = ONslow_query_log_file = /usr/local/src/mysql/data/iZwz9hzc7pd8k6u859n9rzZ-slow.log long_query_time = 3 重启mysql,测试mysql> select sleep(4);[root@iZwz9hzc7pd8k6u859n9rzZ ~]# tail -100 /usr/local/src/mysql/data/iZwz9hzc7pd8k6u859n9rzZ-slow.log/usr/local/src/mysql/bin/mysqld, Version: 5.7.23-log (MySQL Community Server (GPL)). started with:Tcp port: 3306 Unix socket: /tmp/mysql.sockTime Id Command Argument/usr/local/src/mysql/bin/mysqld, Version: 5.7.23-log (MySQL Community Server (GPL)). started with:Tcp port: 3306 Unix socket: /tmp/mysql.sockTime Id Command ArgumentRows_examined: 0SET timestamp=1536025164;select sleep(4); --记录到了刚才的语句 二进制日志开启 cat /etc/my.cnf log-bin=mysql-binbinlog_format=mixed --混合模式server-id = 1sync-binlog = 1 --保证数据库的安全性,但影响一定的性能expire_logs_days = 10 --日志自动删除10天以前的 mysql> show master logs; Log_name File_size mysql-bin.000001 177 mysql-bin.000002 177 mysql-bin.000003 177 mysql-bin.000004 177 mysql-bin.000005 177 mysql-bin.000006 177 mysql-bin.000007 573 mysql-bin.000008 177 mysql-bin.000009 177 mysql-bin.000010 1781 mysql-bin.000011 876 mysql-bin.000012 4132 mysql-bin.000013 154 13 rows in set (0.00 sec)删除二进制日志mysql> purge master logs to 'mysql-bin.000009';Query OK, 0 rows affected (0.01 sec)删除09以前的日志mysql> purge master logs before '2018-09-04';Query OK, 0 rows affected (0.01 sec)删除9月4号之前的日志还可以把expire_logs_days = 10 设置短也可以删除mysqlbinlogmysql> reset master;Query OK, 0 rows affected (0.01 sec)删除所有mysqlbinlog[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqlbinlog /usr/local/src/mysql/data/mysql-bin.000001 /!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1/;/!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0/;DELIMITER /!/; at 4 180904 9:58:17 server id 1 end_log_pos 123 CRC32 0xec6dd750 Start: binlog v 4, server v 5.7.23-log created 180904 9:58:17 at startup Warning: this binlog is either in use or was not closed properly. ROLLBACK/!/;BINLOG 'ueaNWw8BAAAAdwAAAHsAAAABAAQANS43LjIzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC55o1bEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQAAVDXbew='/!/;查看二进制里面的内容 mysql> show binlog events in 'mysql-bin.000001'; Log_name Pos Event_type Server_id End_log_pos Info mysql-bin.000001 4 Format_desc 1 123 Server ver: 5.7.23-log, Binlog ver: 4 mysql-bin.000001 123 Previous_gtids 1 154 mysql-bin.000001 154 Anonymous_Gtid 1 219 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000001 219 Query 1 334 create database mydb default charset utf8 mysql-bin.000001 334 Anonymous_Gtid 1 399 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000001 399 Query 1 498 use mydb; create table emm (id int) mysql-bin.000001 498 Anonymous_Gtid 1 563 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000001 563 Query 1 642 BEGIN mysql-bin.000001 642 Query 1 741 use mydb; insert into emm values(1) mysql-bin.000001 741 Xid 1 772 COMMIT / xid=20 / 10 rows in set (0.00 sec)查看二进制日志里面的事件 数据库备份 [root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -u root -p mydb>~/mydb.sql Enter password: --备份整个库[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -u root -p -d mydb>~/mydb.sqlEnter password: --备份表结构[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -u root -p mydb adds>~/adds.sqlEnter password: --导出某一个或者多个表[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -u root -p -d mydb adds>~/adds.sqlEnter password: --导出一个表或者多个表的表结构[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -uroot -p mydb --ignore-table=mydb.emm>~/ddd.sqlEnter password: --忽略某个表导出数据 数据还原 mysql> drop database mydb; Query OK, 2 rows affected (0.04 sec)--先删除数据库,再创建一个空的mydb数据库[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysql -u root -p mydb .sql Enter password进去查看数据正常但是我们这种备份只能定时去备份,但是现实工作中,数据库是一直运行的,所以当线上数据库被执行了drop操作的话,那怎么恢复过来呢?首先需要定时备份的sql记录二进制的值[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqldump -u root -p --databases mydb --lock-all-tables --flush-logs --master-data=2 > /opt/22.sqlEnter password: -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=154; -- -- Current Database: mydb 会记录日志为000002的154位置现在再在数据库插入数据,然后删除数据库,我们还原步骤。mysql> mysql> show tables; Tables_in_mydb adds emm 2 rows in set (0.00 sec) mysql> insert into emm values(2) -> ; Query OK, 1 row affected (0.01 sec) mysql> insert into emm values(3);Query OK, 1 row affected (0.01 sec) mysql> --插入了两条数据 mysql> show master logs; Log_name File_size mysql-bin.000001 4080 mysql-bin.000002 702 2 rows in set (0.00 sec)--02日志有变化了mysql> drop database mydb;Query OK, 2 rows affected (0.03 sec)删除数据库,创建一个空的数据库mysql> create database mydb default charset utf8;Query OK, 1 row affected (0.00 sec)mysql> use mydb;Database changedmysql> source /opt/22.sql;--导入定时备份的数据 mysql> show binlog events in 'mysql-bin.000002'; Log_name Pos Event_type Server_id End_log_pos Info mysql-bin.000002 4 Format_desc 1 123 Server ver: 5.7.23-log, Binlog ver: 4 mysql-bin.000002 123 Previous_gtids 1 154 mysql-bin.000002 154 Anonymous_Gtid 1 219 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000002 219 Query 1 298 BEGIN mysql-bin.000002 298 Query 1 397 use mydb; insert into emm values(2) mysql-bin.000002 397 Xid 1 428 COMMIT / xid=301 / mysql-bin.000002 428 Anonymous_Gtid 1 493 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000002 493 Query 1 572 BEGIN mysql-bin.000002 572 Query 1 671 use mydb; insert into emm values(3) mysql-bin.000002 671 Xid 1 702 COMMIT / xid=302 / mysql-bin.000002 702 Anonymous_Gtid 1 767 SET @@SESSION.GTID_NEXT= 'ANONYMOUS' mysql-bin.000002 767 Query 1 859 drop database mydb --查看到drop database 在767位置[root@iZwz9hzc7pd8k6u859n9rzZ data]# mysqlbinlog --no-defaults --stop-position="767" /usr/local/src/mysql/data/mysql-bin.000002| mysql -uroot -p6543216 mydbmysql: [Warning] Using a password on the command line interface can be insecure.--导入mysql差异日志 [root@iZwz9hzc7pd8k6u859n9rzZ data]# mysql -u root -p6543216 -e 'use mydb;select * from emm;' mysql: [Warning] Using a password on the command line interface can be insecure. id 1 2 3 数据库已经恢复完毕,只要弄清原理就很容易 数据库优化 一般mysql的使用的较多的是mysiam和innodb引擎 所以一般只要对这两种引擎优化就可以满足工作大多用途 max-allowed-packet = 16M 最大允许的包大小,太小会引起数据插入不到数据库max-connections = 500 最大连接数,太小会线上客户端链接失败,too many concents等innodb-buffer-pool-size = 2G innodb数据缓存池大小,一般设置内存的70%myisam_sort_buffer_size = 8M myisam索引缓冲区还有很多参数需要优化,包含xtrabackup热备等 本文来自 qq_34962337 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_34962337/article/details/82356384?utm_source=copy 我的阿里云优惠券地址:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=3ow2kbko
文章
SQL  ·  监控  ·  关系型数据库  ·  MySQL  ·  数据库
2018-09-25
MySQL数据库“十宗罪”(十大经典错误案例)
老张我在刚开始学习数据库的时候,没少走弯路。经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决问题的办法。跟无头苍蝇一样,会不加思索地把错误粘到百度上,希望赶紧查找一下有没有好的处理问题的方法。我想这个应该是刚从事数据库的小白,都会遇到窘境。 今天就给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理。 学习任何一门技术的同时,其实就是自我修炼的过程。沉下心,尝试去拥抱数据的世界!Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行)问题还原 mysql> show variables like '%max_connection%'; | Variable_name | Value | max_connections | 151 | mysql> set global max_connections=1;Query OK, 0 rows affected (0.00 sec) [root@node4 ~]# mysql -uzs -p123456 -h 192.168.56.132 ERROR 1040 (00000): Too many connections 解决问题的思路: 1、首先先要考虑在我们 MySQL 数据库参数文件里面,对应的 max_connections 这个参数值是不是设置的太小了,导致客户端连接数超过了数据库所承受的最大值。 ● 该值默认大小是151,我们可以根据实际情况进行调整。 ● 对应解决办法:set global max_connections=500但这样调整会有隐患,因为我们无法确认数据库是否可以承担这么大的连接压力,就好比原来一个人只能吃一个馒头,但现在却非要让他吃 10 个,他肯定接受不了。反应到服务器上面,就有可能会出现宕机的可能。所以这又反应出了,我们在新上线一个业务系统的时候,要做好压力测试。保证后期对数据库进行优化调整。 2、其次可以限制 Innodb 的并发处理数量,如果 innodb_thread_concurrency = 0(这种代表不受限制) 可以先改成 16或是64 看服务器压力。如果非常大,可以先改的小一点让服务器的压力下来之后,然后再慢慢增大,根据自己的业务而定。个人建议可以先调整为 16 即可。MySQL 随着连接数的增加性能是会下降的,可以让开发配合设置 thread pool,连接复用。在MySQL商业版中加入了thread pool这项功能另外对于有的监控程序会读取 information_schema 下面的表,可以考虑关闭下面的参数innodb_stats_on_metadata=0set global innodb_stats_on_metadata=0 Top 2:(主从复制报错类型) Last_SQL_Errno: 1062 (从库与主库数据冲突) Last_Errno: 1062 Last_Error: Could not execute Write_rows event on table test.t; Duplicate entry '4' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000014, end_log_pos 1505 针对这个报错,我们首先要考虑是不是在从库中误操作导致的。结果发现,我们在从库中进行了一条针对有主键表的 sql 语句的插入,导致主库再插入相同 sql 的时候,主从状态出现异常。发生主键冲突的报错。 解决方法:在确保主从数据一致性的前提下,可以在从库进行错误跳过。一般使用 percona-toolkit 中的 pt-slave-restart 进行。 在从库完成如下操作[root@zs bin]# ./pt-slave-restart -uroot -proot1232017-07-20T14:05:30 p=...,u=root node4-relay-bin.000002 1506 1062 之后最好在从库中开启 read_only 参数,禁止在从库进行写入操作Last_IO_Errno: 1593(server-id冲突) Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it)这个报错出现之后,就看一目了然看到两台机器的 server-id 是一样的。 在搭建主从复制的过程中,我们要确保两台机器的 server-id 是唯一的。这里再强调一下 server-id 的命名规则(服务器 ip 地址的最后一位+本 MySQL 服务的端口号) 解决方法:在主从两台机器上设置不同的 server-id。Last_SQL_Errno: 1032(从库少数据,主库更新的时候,从库报错)Last_SQL_Error:Could not execute Update_rows event on table test.t; Can't find record in 't', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000014, end_log_pos 1708解决问题的办法:根据报错信息,我们可以获取到报错日志和position号,然后就能找到主库执行的哪条sql,导致的主从报错。 在主库执行:/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=decode-rows /data/mysql/mysql-bin.000014 |grep -A 10 1708 > 1.logcat 1.log 170720 14:20:15 server id 3 end_log_pos 1708 CRC32 0x97b6bdec Update_rows: table id 113 flags: STMT_END_F UPDATE test.t WHERE @1=4 / INT meta=0 nullable=0 is_null=0 / @2='dd' / VARSTRING(60) meta=60 nullable=1 is_null=0 / SET @1=4 / INT meta=0 nullable=0 is_null=0 / @2='ddd' / VARSTRING(60) meta=60 nullable=1 is_null=0 / at 1708 170720 14:20:15 server id 3 end_log_pos 1739 CRC32 0xecaf1922 Xid = 654 COMMIT/!/;DELIMITER ; End of log file ROLLBACK / added by mysqlbinlog /;/!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE/;/!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0/; 获取到 sql 语句之后,就可以在从库反向执行 sql 语句。把从库缺少的 sql 语句补全,解决报错信息。在从库依次执行:mysql> insert into t (b) values ('ddd');Query OK, 1 row affected (0.01 sec)mysql> stop slave;Query OK, 0 rows affected (0.00 sec)mysql> exitBye[root@node4 bin]# ./pt-slave-restart -uroot -proot1232017-07-20T14:31:37 p=...,u=root node4-relay-bin.000005 283 1032 Top 3:MySQL安装过程中的报错[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &[1] 3758[root@zs data]# 170720 14:41:24 mysqld_safe Logging to '/data/mysql/error.log'.170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql170720 14:41:25 mysqld_safe mysqld from pid file /data/mysql/node4.pid ended170720 14:41:24 mysqld_safe Starting mysqld daemon with databases from /data/mysql2017-07-20 14:41:25 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details)./usr/local/mysql/bin/mysqld: File '/data/mysql/mysql-bin.index' not found (Errcode: 13 - Permission denied)2017-07-20 14:41:25 4388 [ERROR] Aborting 解决思路:遇到这样的报错信息,我们要学会时时去关注错误日志 error log 里面的内容。看见了关键的报错点 Permission denied。证明当前 MySQL 数据库的数据目录没有权限。 解决方法:[root@zs data]# chown mysql:mysql -R mysql[root@zs data]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &[1] 4402[root@zs data]# 170720 14:45:56 mysqld_safe Logging to '/data/mysql/error.log'.170720 14:45:56 mysqld_safe Starting mysqld daemon with databases from /data/mysql启动成功。 如何避免这类问题,个人建议在安装 MySQL 初始化的时候,一定加上--user=mysql,这样就可以避免权限问题。./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --defaults-file=/etc/my.cnf --user=mysqlTop 4:数据库密码忘记的问题[root@zs ~]# mysql -uroot -pEnter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)[root@zs ~]# mysql -uroot -pEnter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 我们有可能刚刚接手别人的 MySQL 数据库,而且没有完善的交接文档。root 密码可以丢失或者忘记了。解决思路:目前是进入不了数据库的情况,所以我们要考虑是不是可以跳过权限。因为在数据库中,mysql数据库中user表记录着我们用户的信息。解决方法:启动 MySQL 数据库的过程中,可以这样执行:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &这样启动,就可以不用输入密码,直接进入 mysql 数据库了。然后在修改你自己想要改的root密码即可。update mysql.user set password=password('root123') where user='root'; Top 5:truncate 删除数据,导致自动清空自增ID,前端返回报错 not found。这个问题的出现,就要考虑下 truncate 和 delete 的区别了。看下实验演练:首先先创建一张表;CREATE TABLE t (a int(11) NOT NULL AUTO_INCREMENT,b varchar(20) DEFAULT NULL, PRIMARY KEY (a), KEY b (b)) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8 插入三条数据:mysql> insert into t (b) values ('aa');Query OK, 1 row affected (0.00 sec)mysql> insert into t (b) values ('bb');Query OK, 1 row affected (0.00 sec)mysql> insert into t (b) values ('cc');Query OK, 1 row affected (0.00 sec) mysql> select * from t; a b 300 aa 301 bb 302 cc 3 rows in set (0.00 sec)先用 delete 进行删除全表信息,再插入新值。结果发现 truncate 把自增初始值重置了,自增属性从1开始记录了。当前端用主键id进行查询时,就会报没有这条数据的错误。个人建议不要使用 truncate 对表进行删除操作,虽然可以回收表空间,但是会涉及自增属性问题。这些坑,我们不要轻易钻进去。 Top 6: 阿里云 MySQL 的配置文件中,需要注意一个参数设置就是:lower_case_table_names = 0;默认情况lower_case_table_names = 1;是不区分大小写 . 如果报你小写的表名找不到, 那你就把远端数据库的表名改成小写 , 反之亦然 . 注意 Mybatis 的 Mapper 文件的所有表名也要相应修改 Top 7:有同学经常会问张老师,为什么我的数据库总会出现中文乱码的情况。一堆????不知道怎么回事。当向数据库中写入创建表,并插入中文时,会出现这种问题。此报错会涉及数据库字符集的问题。 解决思路:对于中文乱码的情况,记住老师告诉你的三个统一就可以。还要知道在目前的mysql数据库中字符集编码都是默认的UTF8处理办法:1、数据终端,也就是我们连接数据库的工具设置为 utf82、操作系统层面;可以通过 cat /etc/sysconfig/i18n 查看;也要设置为 utf83、数据库层面;在参数文件中的 mysqld 下,加入 character-set-server=utf8。Emoji 表情符号录入 mysql 数据库中报错。Caused by: java.sql.SQLException: Incorrect string value: 'xF0x9Fx98x97xF0x9F...' for column 'CONTENT' at row 1at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)解决思路:针对表情插入的问题,一定还是字符集的问题。 处理方法:我们可以直接在参数文件中,加入vim /etc/my.cnf[mysqld]init-connect='SET NAMES utf8mb4'character-set-server=utf8mb4注:utf8mb4 是 utf8 的超集。 Top 8:使用 binlog_format=statement 这种格式,跨库操作,导致从库丢失数据,用户访问导致出现错误数据信息。当前数据库二进制日志的格式为:binlog_format=statement在主库设置binlog-do-db=mydb1(只同步mydb1这一个库)在主库执行use mydb2;insert into mydb1.t1 values ('bb');这条语句不会同步到从库。但是这样操作就可以;use mydb1;insert into mydb1.t1 values ('bb');因为这是在同一个库中完成的操作。在生产环境中建议使用binlog的格式为row,而且慎用binlog-do-db参数。 Top 9:MySQL 数据库连接超时的报错 ;org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hibernate.util.JDBCExceptionReporter - The last packet successfully received from the server was43200 milliseconds ago.The last packet sent successfully to the server was 43200 milliseconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection 'autoReconnect=true' to avoid this problem.org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with sessionorg.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch updatecom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08003org.hibernate.util.JDBCExceptionReporter - No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error: BEGIN NESTED EXCEPTION 大多数做 DBA 的同学,可能都会被开发人员告知,你们的数据库报了这个错误了。赶紧看看是哪里的问题。 这个问题是由两个参数影响的,wait_timeout 和 interactive_timeout。数据默认的配置时间是28800(8小时)意味着,超过这个时间之后,MySQL 数据库为了节省资源,就会在数据库端断开这个连接,Mysql服务器端将其断开了,但是我们的程序再次使用这个连接时没有做任何判断,所以就挂了。解决思路:先要了解这两个参数的特性;这两个参数必须同时设置,而且必须要保证值一致才可以。我们可以适当加大这个值,8小时太长了,不适用于生产环境。因为一个连接长时间不工作,还占用我们的连接数,会消耗我们的系统资源。解决方法:可以适当在程序中做判断;强烈建议在操作结束时更改应用程序逻辑以正确关闭连接;然后设置一个比较合理的timeout的值(根据业务情况来判断)Top 10 :can't open file (errno:24)有的时候,数据库跑得好好的,突然报不能打开数据库文件的错误了。解决思路:首先我们要先查看数据库的 error log。然后判断是表损坏,还是权限问题。还有可能磁盘空间不足导致的不能正常访问表;操作系统的限制也要关注下;用 perror 工具查看具体错误!linux:/usr/local/mysql/bin # ./perror 24OS error code 24: Too many open files超出最大打开文件数限制!ulimit -n查看系统的最大打开文件数是65535,不可能超出!那必然是数据库的最大打开文件数超出限制!在 MySQL 里查看最大打开文件数限制命令:show variables like 'open_files_limit';发现该数值过小,改为2048,重启 MySQL,应用正常 处理方法:repair table ;chown mysql权限清理磁盘中的垃圾数据 今后还会继续总结 MySQL 中的各种报错处理思路与方法,希望跟各位老铁们,同学们一起努力。多沟通多交流!
文章
2019-07-03
MySQL主从复制配置
 一、MySQL复制的应用常见场景 读写分离,提高查询访问性能,有效减少主数据库访问压力。 实时灾备,主数据库出现故障时,可快速切换到从数据库。 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。 二、MySQL主从复制原理介绍   1、 MySQL异步和半同步复制传统的MySQL复制提供了一种简单的主-从复制方法。有一个主,以及一个或多个从。主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。    这是一个shared-nothing(异步)的系统,默认情况下所有server成员都有一个完整的数据副本。(主节点不依赖从节点)    还有一个半同步复制,他在协议中添加了一个同步步骤,这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。    上两张图片,可以看到传统一部MySQL复制协议(以及半同步)的图形展示。蓝色箭头表示在不同server之间或者server与client应用之间的信息交互。2、MySQL主从复制过程 开启binlog日志,通过把主库的binlog传到从库,从新解析应用到从库。 复制需要3个线程(dump、io、sql)完成 3、MySQL主从复制前提 主服务器一定要打开二进制日志 必须两台服务器(或者是多个实例) 从服务器需要一次数据初始化 如果主从服务器都是新搭建的话,可以不做初始化 如果主服务器已经运行了很长时间了,可以通过备份将主库数据恢复到从库。 主库必须要有对从库复制请求的用户。 从库需要有relay-log设置,存放从主库传送过来的二进制日志show variables like '%relay%'; 在第一次的时候,从库需要change master to去连接主库。 change master信息需要存放到master.info 中show variables like '%master_info%'; 从库怎么知道,主库发生了新的变化?通过relay-log.info记录的已经应用过的relay-log信息。 在复制过程中涉及到的线程 从库会开启一个I0 thread(线程),负责连接主库,请求binlog, 接收binlog并写入relay-log。 从库会开启一个SQL thread(线程),负责执行relay-log中的事件。 主库会开启一个dump thrad(线程),负责响应从I0 thread的请求。 4、MySQL主从复制实现2、MySQL复制有三种核心格式8、MySQL授权远程主机登录grant all privileges on *.* to 'slave'@'192.168.%.%' identified by '123456' with grant option;9、MySQL编辑配置文件9.1、master配置文件vim /etc/my.cnfdefault-storage-engine=INNODBsymbolic-links=0server_id=6log_bin=/var/log/mysql/mysql-bin9.1.2、创建相应文件夹以及更改属性[root@localhost ~]# mkdir -p /var/log/mysql[root@localhost ~]# chown -R mysql.mysql /var/log/mysql[root@localhost ~]# ll -d /var/log/mysqldrwxr-xr-x. 2 mysql mysql 203 4月  29 16:22 /var/log/mysql[root@localhost ~]#重启动数据库9.2、Slave配置文件vim /etc/my.cnfdefault-storage-engine=INNODBsymbolic-links=0server_id=8log_bin=/var/log/mysql/mysql-binrelay_log=/var/log/mysql/mysql-relay9.2.2、创建相应文件夹以及更改属性[root@localhost ~]# mkdir -p /var/log/mysql[root@localhost ~]# chown -R mysql.mysql /var/log/mysql[root@localhost ~]# ll -d /var/log/mysqldrwxr-xr-x. 2 mysql mysql 203 4月  29 16:22 /var/log/mysql[root@localhost ~]#重启动数据库10、MySQL创建主从同步账号 在主库创建一个专门用来复制的数据库用户,所有从库都用这个用户来连接主库,确保这个用户只有复制的权限 create user 'slave'@'192.168.%.%' identified by '123456';如果出现密码不符合要求的问题则按以下解决修改密码的策略,使得可以设置简单的密码如果想要查看MySQL完整的初始密码规则,登陆后执行以下命令SHOW VARIABLES LIKE 'validate_password%';密码的长度是由validate_password_length决定的,但是可以通过以下命令修改set global validate_password_length=4;validate_password_policy决定密码的验证策略,默认等级为MEDIUM(中等),可通过以下命令修改为LOW(低)set global validate_password_policy=0;删除已有账户delete from mysql.user where user ='用户名';查询已创建的用户select user,host from mysql.user;授权用户复制权限grant replication slave on *.* to 'slave'@'192.168.%.%';查看指定用户的授权情况show grants for 'slave'@'192.168.%.%';关闭防火墙systemctl stop firewalld再从服务器上使用slave账户远程连接主服务器mysql -h192.168.126.133 -uslave -p连接成功查看MySQL主服务器的状态show master status;13、MySQL主库备份数据mysqldump -uroot -p123456 --master-data --all-databases > master.sql将备份的文件master.sql拷贝到从服务器scp master.sql 192.168.126.132:/root在从数据库中执行下列语句,将备份数据还原到从服务器中,同步数据[root@localhost ~]# mysql -p123456 < master.sql [root@localhost ~]# mysql -p123456 < master.sql mysql: [Warning] Using a password on the command line interface can be insecure. [root@localhost ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.38-log MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user,host from mysql.user; +---------------+-------------+ | user | host | +---------------+-------------+ | slave | 192.168.%.% | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-------------+ 4 rows in set (0.01 sec) mysql>15、MySQL从库配置同步 再从库上建立复制关系,即从库指定主库的日志信息和链接信息 mysql> change master to -> master_host='192.168.126.133', -> master_port=3306, -> master_user='slave', -> master_password='123456', -> master_log_file='mysql-bin.000003', -> master_log_pos=154; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql>注意这两个值需要根据主服务器上显示的值来写master_log_file='mysql-bin.000003', master_log_pos=154;在主服务器上输入一下命令即可显示出来关闭主从服务器防火墙和一些安全策略,不想关闭就启动从服务mysql> start slave; Query OK, 0 rows affected (0.02 sec) mysql>查看从的状态mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.126.133 Master_User: slave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 154 Relay_Log_File: mysql-relay.000003 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes ........ Master_Server_Id: 6 Master_UUID: 753763f0-c7a4-11ec-b29b-000c297f1d9e Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) mysql>注意看红色部分,主从配置完成,如果是克隆的虚拟机注意查看server-uuid,主从的uuid是不一致的,需要自行修改。[root@localhost ~]# vim /var/lib/mysql/auto.cnf [auto] server-uuid=753763f0-c7a4-11ec-b29b-000c297f1d91测试主服务起的数据能否同步到从服务器上在主服务器创建test_slave 数据库mysql> create database test_slave; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test_slave | +--------------------+ 5 rows in set (0.00 sec) mysql>在从服务器上查看,是否同步mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test_slave | +--------------------+ 5 rows in set (0.06 sec) mysql>从服务器也能看到test_slave 测试库,测试同步成功。
文章
SQL  ·  关系型数据库  ·  MySQL  ·  网络安全  ·  数据库  ·  开发工具  ·  数据安全/隐私保护
2022-05-01
引以为戒:记一次心惊肉跳的服务器误删文件的恢复过程
经历了两天的不懈努力,终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。     1 事故背景  安排一个妹子在一台生产服务器上安装Oracle,妹子边研究边安装,感觉装的不对,准备卸载重新安装。从网上找到卸载方法,其中要执行一行命令删除Oracle的安装目录,命令如下:   rm -rf $ORACLE_BASE/*  如果ORACLE_BASE这个变量没有赋值,那命令就变成了:   rm -rf /*  = =妹子使用的可是root账户啊。就这样,把整个盘的文件全部删除了,包括应用Tomcat、MySQL数据库 and so on……   (MySQL数据库不是在运行吗?Linux能删除正在执行的文件?反正是彻底删除了,最后还剩一个tomcat的log文件,估计是文件过大,一时没有删除成功)   看着妹子自责的眼神,又是因为这事是我安排她做的,也没有跟她讲清利害关系,没有任何培训,责任只能一个人背了,况且怎么能让美女背负这个责任呢?   打电话到机房,将盘挂到另一台服务器上,ssh上去查看文件全部被清,这台服务器运行的可是一个客户的生产系统啊,已经运行大半年了,得尽快恢复啊。于是找来脱机备份的数据库,发现备份文件只有1kb,里面只有几行熟悉的MySQLdump注释(难道是crontab执行的备份脚本有问题),最接近的备份也是2013年12月份的了,真是屋漏偏逢连夜雨啊。   想起来一位领导说过的案例:当一个生产系统挂掉以后,发现所有备份都有问题,刻录的光盘也有划痕,磁带机也坏了(一个业界前辈,估计以前还用光盘做备份了),没想到今天真的应验到我的身上了,怎么办?   部门领导知道情况后,已经做了最坏的B计划:领导亲自带队和产品AA周日赶到客户所在的地市,星期一去领导层沟通;BB和CC去客户管理员那边想办法说服客户……     2 救命稻草--ext3grep  赶快到网上去查资料进行误删数据恢复,还真找到一款ext3grep能够恢复通过rm -rf删除的文件,我们磁盘也是ext3格式,且网上有不少的成功案例。于是燃起了一丝希望,赶快对盘umount,防止重新写入补删文件扇区。下载ext3grep,安装(编译安装过程艰辛暂且不表)。   先执行扫描文件名命令:   ext3grep /dev/vgdata/LogVol00 --dump-names  打印出了所有被删除文件及路径,心中狂喜,不用执行B计划了,文件都在呢。   这款软件不能按目录恢复文件,只能执行恢复全部命令:   ext3grep /dev/vgdata/LogVol00 --restore-all  结果当前盘空间不足,没办法只能恢复文件,尝试了几个文件,居然部分成功部分失败。   ext3grep /dev/vgdata/LogVol00 --restore-file var/lib/MySQL/aqsh/tb_b_attench.MYD  心里不禁一凉,难道是删除磁盘上被写过文件了?恢复机率不大了啊,能恢复几个算几个吧,说不定重要数据文件刚好在能恢复的MYD文件中。于是先将所有文件名重定向到一个文件文件中:   ext3grep /dev/vgdata/LogVol00 --dump-names >/usr/allnames.txt  过滤出来所有MySQL数据库的文件名存成,MySQLtbname.txt   编写脚本恢复文件:     执行,大概运行了20分钟,恢复了40多个文件,但不够啊,我们将近100张表,每张表frm,myd,myi三个文件,怎么说也有300多个左右啊!将找回来的文件附到现有数据库上,更要文件权限为777后,重启MySQL,也算是找回一部分数据了,但客户重要的考勤签到数据、手机端上报数据(据说客户按这些数据做员工绩效的)还没找回来啊。   咋办?中间又试了另一款工具extundelete,跟ext3grep语法基本一致,原理应该也一样了,但是据说能按目录恢复,好吧试一试。   extundelete /dev/vgdata/LogVol00 --restore-directory var/lib/MySQL/aqsh  果然不出所料,恢复不出来!那些文件已被破坏了。跟领导汇报,执行B计划吧……无奈之下下班回家(周末了,回去休息一下,想想办法吧)     3 灵机一动:binlog   第二天早晨一早就醒了(心里有事啊),背上电脑,去公司(这个周末算是报销了,不挨批,通报,罚款,开除就不错了,还过什么周末啊)。   依旧运行ext3grep,extundelete,也就那几招啊,把系统架到测试服务器上,看看数据能不能想办法补一补吧。在测试服务器上进行MySQLdump,恢复文件,覆盖恢复回来的文件,给文件加权限,重启MySQL。   wait,wait,不是有binlog吗?我们服务都要求开启binlog,说不定能通过binlog里恢复数据呢?   于是从dump出来的文件名里找到binlog的文件,一共三个,MySQL-binlog0001,MySQL-bin.000009,MySQL-bin.000010,恢复一下0001。   ext3grep /dev/vgdata/LogVol00 --restore-file var/lib/MySQL/MySQL-bin.000001  居然失败了……   再看另两个文件,MySQL-bin.000010大概几百MB,应该靠谱一点,执行还原命令,居然成功了!   赶快scp到测试服务器。执行binlog还原。   MySQLbinlog /usr/MySQL-bin.000010 | MySQL -uroot -p  输入密码,卡住了(好现象),经过漫长的等待,终于结束了。打开应用,哦,感谢CCTV、MTV,数据回来了!     4 后记  经过此次事故,虽然数据很幸运能找回来了,但过程却是惊心动魄的。也为自己的错误所带来的后果,给同事和领导带来的连带责任而后怕。也希望谨记此次事故,以后不再犯同样的错误。事故反思如下:   本次安排MM进行服务器维护时没有提前对她进行说明利害情况,自己也未重视,管理混乱,流程混乱。一个在线的生产系统,任何一个改动一定要先谋而后动。 自动备份出现问题,没有任何人检查。脱机备份人员每次从服务器上下载1k的文件却从未重视。需要明确大家在工作岗位上的责任。 事故发生后,没有及时发现,造成部分数据写入磁盘,造成不可恢复问题。需要编写应用监控程序,服务一旦有异常,短信告警相关责任人。 不能使用root用户来操作。应该在服务器上开设不同权限级别的用户。   通过本次事故,几位跟这个项目和事故没有任何关系的同事,主动前来帮忙,查资料,帮测试,有一位同事还帮忙到晚上1点多钟进行数据恢复测试。同时产品经理在想到面向客户的巨大压力的情况下,没有慌乱而责怪开发人员和具体操作人,而让大家能静下心来想解决方案。部门领导也积极主动的帮忙想办法,陪我们加班测试,实时跟踪事情进程。   通过大家的共同努力,终于事情相对圆满结束,接下来,周一上午进行集体反思,总结经验教训,这类事故一定尽量大努力进行避免。   本文所用到的工具链接:   1、ext3grep:https://code.google.com/p/ext3grep/   编译安装依赖包比较多,可以到网上搜索如何安装。可惜的是作者给出的howto被墙了,我FQ将how to 的pdf文档下载下来了,读完后你将会对Linux的文件系统有进一步的认识。下载howto。   这个工具有一个bug,出错后不会向下执行ext3grep: init_directories.cc:534: void init_directories(): Assertion `lost_plus_found_directory_iter != all_directories.end()' failed.,从而造成恢复失败,作者放出了一个补丁,下载地址:补丁下载(链接:https://ext3grep.googlecode.com/issues/attachment?aid=3222478933841854269&name=lostfound_missing.patch&token=ABZ6GAfPeDpgvmC7lK0tdcQCktSl6-dODw%3A1400329392182)。不明白为什么作者的新版没有把这个补丁加进去。   2、extundelete:http://extundelete.sourceforge.net/   功能跟ext3grep差不多,原理应该也差不多。只是号称可以还原目录,我这里没有试验成功。   作者介绍  zhouyu 高级研发工程师,现就职于某大型国企,熟悉JAVA、PHP等开发语言及ORACLE等主流数据库,熟练掌握响应式软件开发,跨平台APP开发。熟悉CMMI和SCRUM软件开发模型,有多年外企开发和管理经验。 本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-08-31
文章
Oracle  ·  MySQL  ·  关系型数据库  ·  测试技术  ·  数据库
2017-05-02
成为MySQL DBA 博客系列-数据库升级
数据库供应商通常每个月都会发布一些有bug /安全性修补程序的补丁,我们为什么要关心?新的版本可能对关于安全漏洞和黑客入侵系统的修复,所以除非安全性不被关注,否则您可能希望在您的系统上安装最新的安全修补程序。其中MySQL主要版本比较少见,通常是次版本升级。但是他们可能会带来一些重要的功能,使升级更值得付出。 在这篇博文中,我们将介绍DBA的一个最基本的任务 - 次要版本数据库升级和主要数据库升级 MySQL升级 有二个版本MySQL官方已经不在关注和修复,是因为在oracle收购MySQL之前的发行版本。它发生在2013年12月4日的MySQL 5.1以及2012年1月9日的MySQL5.0之前。在GA发布8年后的2018年,MySQL 5.5也会发生这种情况。这意味着对于MySQL 5.0和MySQL 5.1,用户不能依靠官方的修复 - 即使是严重的安全漏洞。这通常是您真正需要计划将MySQL升级到更新版本的一点。 友情建议 推荐使用MySQL5.6最新 或者 MySQL5.7.20之后的版本。叶师傅的朋友圈已经有说关于MySQL5.7.20之前的bug。 但是,您不会只处理主要的版本升级,而是在工作中更经常地升级到次要版本,例如5.6.x - > 5.6.y. 最有可能的是,最新版本会为影响工作负载的错误带来一些修复,但也可能是其他原因。 在执行主版本和次版本升级方式方面存在显着差异。 友情建议 关于版本子版本升级 尤其是成熟的版本,大多数是对bug的修复。可以根据发行说明来判断是否要升级。不过不建议使用子版本低于20 准备工作 在您考虑执行升级之前,您需要决定需要进行哪种测试。理想情况下,您有一个测试/开发环境,可以为常规版本进行测试。如果是这样的话,进行升级前测试的最好方法就是使用新的MySQL版本来构建临时环境的数据库层。一旦完成,您可以继续进行一组常规测试。更多更好 - 你不仅要关注“xx功能/xxbug”方面,还要关注性能。 在数据库方面,你也可以做一些通用的测试。为此,您需要一个慢日志格式的查询列表。然后,可以使用pt-upgrade在旧版本和新版本的MySQL上运行它们,比较响应时间和结果集。在过去,我们已经注意到,pt-upgrade会返回很多误报 - 它可能会将查询报告为慢,而事实上,两个版本的查询都是完全正确的。为此,您可能需要引入一些额外的完整性检查 - 解析pt-upgrade输出,获取报告的慢速查询,再次在服务器上执行这些查询,并再次比较结果。你需要记住,你应该以同样的方式连接到新旧数据库服务器(套接字连接将比TCP更快)。 这种通用测试的典型结果是执行计划发生变化的查询 - 通常添加一些索引或强制优化器选择正确的查询就足够了。您还可以看到结果集中存在差异的查询 - 这很可能是查询中缺少显式ORDER BY的结果 - 如果不对其进行排序,则无法依赖行的排序方式。 友情建议 关于升级 操作之前强烈要求备份。个人认为 一个DBA除了要考虑性能,更多的是稳定,安全。 次要版本升级 小升级相对容易执行 - 大多数情况下,您只需要使用发行版的软件包管理器来安装新版本即可。一旦你这样做,你需要确保升级后MySQL已经启动,然后你应该运行mysql_upgrade脚本。该脚本遍历数据库中的表,并确保它们与当前版本兼容。它也可能修复你的系统表,如果需要的话。 显然,安装新版本的软件包需要停止服务。因此您需要规划升级过程。如果使用Galera Cluster或MySQL复制,它可能会略有不同。 MySQL复制 当我们处理MySQL复制时,升级过程相当简单。您需要通过升级slave,在执行升级所需的时间内将其停止运行(如果一切顺利,不超过几分钟的停机时间,则是很短的时间)。为此,您可能需要在代理配置中进行一些临时更改,以确保流量不会被路由到正在维护的slave设备。这里很难给出任何细节,因为这取决于你的设置。在某些情况下,可能甚至不需要进行任何更改,因为代理可以自行适应拓扑更改,并检测哪个节点可用,哪个不可用。顺便说一句,这就是你应该如何配置你的代理。 一旦每个从机都被更新,您需要执行一个计划的故障切换。我们在较早的博客文章中讨论了这个过程。该过程也可能取决于您的设置。如果你有自动化的工具(例如MHA),它不一定是手动的。一旦选出新的主服务器并完成故障切换,则应该对旧主服务器执行升级,此时应该将新服务器从新主服务器上删除。这将结束MySQL复制设置的次要版本升级。 个人建议 升级从库的时候 一定要留心主从的报错 show slave status中的error。 Galera升级使用Galera,执行升级要容易一些 - 您需要逐个停止节点,升级停止的节点,然后重新启动,然后再转到下一个节点。如果您的代理需要一些手动调整来确保流量不会受到正在进行维护的节点的攻击,则必须进行这些更改。如果它可以自动检测所有的东西,你只需要停止MySQL,升级并重新启动。一旦您浏览了集群中的所有节点,升级就完成了。 个人建议 升级Galera 一定要测试 测试 测试 备份 备份 备份。有个比较完善的回退方案.猥琐发育,不要浪。 主要版本升级 MySQL中的主要版本升级将是5.x - > 5.y甚至4.x> 5.y。这样的升级比较复杂,比较复杂,我们刚刚在前面的段落中提到的小升级。 执行升级的推荐方式是转储并重新加载数据 - 这需要一些时间(取决于数据库的大小),但是在从站不在旋转的情况下执行升级通常是不可行的。即使使用mydumper / myloader,这个过程也会花费很长时间。一般来说,如果数据集大于几百GB,则可能需要额外的准备工作。 尽管可能只是进行二进制升级(安装新软件包),但不建议这样做,因为旧版本和新版本之间可能存在一些二进制格式的不兼容问题,甚至在执行mysql_upgrade之后,仍然可能造成一些问题。我们已经看到了二进制升级导致的一些奇怪的行为,如何在优化器的工作原理,或导致不稳定。所有这些问题都通过执行转储/重新加载过程来解决。所以,虽然运行二进制升级也许可以,但是您也可能遇到严重的问题 - 这是您的要求,最终是您的决定。如果您决定执行二进制升级,则需要执行详细(耗时)的测试,以确保不会破坏任何内容。否则,你有风险。 MySQL复制 如果我们的设置基于MySQL复制,我们将在新的MySQL版本上构建一个从站。假设我们正在从MySQL 5.5升级到MySQL 5.6。由于我们必须执行一个很长的转储/重新加载过程,我们可能需要为此构建一个单独的MySQL主机。最简单的方法是使用xtrabackup从一个从站获取数据以及复制坐标。这些数据将允许您将新节点从旧节点上删除。一旦新节点(仍在运行MySQL 5.5 - xtrabackup只是移动数据,所以我们必须使用相同的,原始的MySQL版本)启动并运行后,是时候转储数据了。您可以使用我们之前在“备份和还原”中发布的任何逻辑备份工具。只要您稍后可以恢复数据,则无关紧要。 转储完成后,该停止MySQL,清除当前数据目录,在节点上安装MySQL 5.6,使用mysql_install_db脚本初始化数据目录并启动新的MySQL版本。那么是时候加载转储 - 这个过程也可能需要很长时间。一旦完成,你应该有一个新的和干净的MySQL 5.6节点。现在是时候把它和master一起同步了 - 你可以使用xtrabackup收集的坐标将节点从运行MySQL 5.5的生产集群的成员中删除。这里需要记住的重要一点是,如果您最终要将节点从当前的生产群集中删除,则需要确保二进制日志不会旋出。对于大型数据集,转储/重新加载过程可能需要几天,因此您需要调整expire_logs_days因此在主人。你也想确认你有足够的可用磁盘空间用于所有这些binlog。 一旦我们拥有一个MySQL 5.5从属MySQL 5.5主服务器,现在是时候浏览5.5个从服务器并升级它们了。现在最简单的方法是利用xtrabackup从5.6节点复制数据。所以,我们把一个5.5从机停掉,停止MySQL服务器,清除数据目录,将MySQL升级到5.6,使用xtrabackup从其它5.6从机恢复数据。一旦完成,您可以再次设置复制,并且应该全部设置。 这个过程比为每个从站执行转储/重新加载要快得多 - 每个复制群集执行一次就可以了,然后使用物理备份来重建其他从站。如果您使用AWS,则可以依靠EBS快照而不是xtrabackup。与逻辑备份类似,只要能够正常工作,重建从站的方式并不重要。 最后,一旦所有从站都升级完毕,您需要从5.5主站到5.6从站之一进行故障切换。在这一点上,可能发生的情况是,您将无法在复制中保留5.5(即使您在它们之间设置了主 - 主复制)。一般来说,不支持从新版本的MySQL复制到较旧的版本 - 复制可能会中断。不管怎么样,您都需要使用与从服务器相同的流程来升级和重建旧的主服务器。 Galera升级 与MySQL复制相比,Galera同时更加容易升级。用Galera创建的集群应该被看作是一个MySQL服务器。在讨论Galera升级时,记住这一点至关重要 - 它不是一个拥有一些slave或者相互连接的master - 就像一台服务器一样。要执行单个MySQL服务器的升级,您需要执行脱机升级(使其不能轮换,转储数据,将MySQL升级到5.6,加载数据,重新启动它)或创建一个从属服务器,升级它并最终故障转移到它(我们在上一节讨论MySQL复制升级时描述的过程)。 同样的事情适用于Galera集群 - 您要么升级所有节点(所有节点),要么必须构建一个从属节点 - 另一个通过MySQL复制连接的Galera集群。 在线升级过程可能如下所示。对于初学者来说,你需要在MySQL 5.6上创建slave - 进程与上面完全一样:创建一个包含MySQL 5.5的节点(可以是Galera但不是必须的),使用xtrabackup复制数据和复制坐标,dump数据使用逻辑备份工具,清除数据目录,将MySQL升级到5.6 Galera,引导集群,加载数据,从节点关闭5.5 Galera集群。 此时,您应该有两个Galera群集 - 5.5和一个Galera 5.6的单个节点,都通过复制连接。下一步将是建立一个生产规模的5.6集群。很难说如何做 - 如果你在云端,你可以旋转新的实例。如果您在数据中心中使用共置服务器,则可能需要将某些硬件从旧群集移到新群集。您需要记住系统的总容量,以确保它能够处理一些不能轮换的节点。虽然硬件管理可能会非常棘手,但最好不要过多关注构建5.6群集 - Galera将使用SST自动填充新节点。 一般来说,这个阶段的目标是建立一个足够处理生产工作量的5.6集群。一旦完成,您需要故障转移到5.6 Galera群集 - 这将结束升级。当然,您可能仍然需要添加更多的节点,但现在是一个定期调配Galera节点的过程,现在只使用5.6而不是5.5。
文章
关系型数据库  ·  MySQL  ·  测试技术  ·  数据库  ·  数据库管理
2018-04-10
Navicat操作MySQL简易教程
1.Navicat简介Navicat 是一款成熟可靠的数据库管理工具,深受技术人员的喜爱。它是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。Navicat 可以用来对本机或远程的 MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL 数据库进行管理及开发。可运行在 Windows 、macOS、Linux 三种操作系统中,可提供数据传输、数据同步、结构同步、导入、导出、备份、还原、报表创建工具及计划以协助管理数据等功能。Navicat 目前在市场上有很多在用的版本,大体可分为可连接多种数据源的 Navicat Premium 和用于单数据源的 Navicat for MySQL 等。不过不同版本之间差别并不大。2.简易教程分享首先说明下,Navicat 正版是收费软件,这里不会讲解安装及破解方法。连接管理选择新建连接,填入 IP 、端口及账号密码即可新建数据库连接。若想换个账号登录,可以点击复制连接,则 IP 端口会自动填充,只需更改账号密码即可。关于连接管理还是很容易上手的。image.png库表操作选中相应的库表,点击右键即可选择相应操作,和写 SQL 效果类似。不过也要注意不要误操作哦,特别是点击删除时一定要看清楚。清空表的意思是 delete from ,截断表的意思是 truncate。image.pngimage.png查询窗口查询窗口经常用到,选择相应库,点击新建查询即可打开查询窗口。在查询窗口中我们可以执行我们自定义的 SQL 语句,不过这里也提醒下,不要在一个查询窗口里放多条 SQL 哦,最好选中某条 SQL 再点击执行。当 SQL 比较长时,可以点击美化 SQL 使得更具有可读性,点击解释按钮还可以展示该 SQL 的执行计划。image.png筛选表数据当我们打开一个表,发现表数据较多,可以点击筛选,选中合适的条件来筛选出所需数据。有时候想偷下懒不想写 SQL 时可以试试此功能。image.png运行与转储 SQL 文件选中相应的库,点击运行 SQL 文件即可选择本地文件进行执行。选中库或表,点击转储 SQL 文件即可备份相应的库表,也可选择只备份结构。对库表操作前,建议进行备份下。image.png导入与导出向导如果你有 Excel 数据想导入某个表中,或者想把某个表的数据导出为 Excel 格式,则可以选中表,选择导入向导或导出向导,根据提示一步步来即可完成,不过一般适用于小数据量。image.png查看页面设置点击上方查看栏,可以选择页面不同的展现方式,建议选择详细信息,这样可以清楚看到每个表的相关信息,右侧边栏可以查看表的创建语句。image.png工具目标栏点击上方工具栏,这里有着更多的实用工具。数据传输、数据同步和结构同步让你以低成本轻松快速地迁移数据。也在各种数据库管理系统之间传输数据。image.png总结:Navicat 的功能还有很多,比如账号及权限管理、数据库模型设计等等,上面只是分享下笔者常用的一些功能。工具只是为了提升效率,但这一切的前提是我们熟悉数据库并且熟悉我们所使用的工具。遇到你不熟悉的功能还是要慎用,可能对数据库产生破坏哦,命令行与可视化工具结合使用也是不错的选择。
文章
SQL  ·  数据可视化  ·  Oracle  ·  关系型数据库  ·  MySQL  ·  数据库连接  ·  数据库  ·  数据安全/隐私保护  ·  数据库管理  ·  Windows
2022-05-31
...
跳转至:
数据库
249304 人关注 | 44495 讨论 | 62320 内容
+ 订阅
  • SQL Server数据库数据类型详解
  • SQL Server——数据库创建及修改
  • autojs世界记忆大师都在用的方法
查看更多 >
开发与运维
5243 人关注 | 125834 讨论 | 202013 内容
+ 订阅
  • 全网最硬核 Java 新内存模型解析与实验 - 5. JVM 底层内存屏障源码分析
  • Java 程序员缺乏经验的7种表现
  • SQL Server数据库数据类型详解
查看更多 >
安全
1059 人关注 | 23287 讨论 | 56008 内容
+ 订阅
  • 关于 Java 18 你想知道的一切(下)
  • 关于 Java 18 你想知道的一切(上)
  • 《Guava》基础 入门
查看更多 >
大数据
184480 人关注 | 23063 讨论 | 57018 内容
+ 订阅
  • SQL Server数据库数据类型详解
  • 【每日算法Day 97】经典面试题:求两个数组最小差
  • (一)微信小程序从入门到实战之开发工具安装
查看更多 >
云原生
230258 人关注 | 9543 讨论 | 29664 内容
+ 订阅
  • LeetCode 11-15 题 详解 Java版 ( 万字 图文详解 LeetCode 算法题11-15 =====>>> <建议收藏>)
  • 从零开始搭建创业公司全新技术栈
  • 阿里一面,谈谈策略模式在云原生项目中的使用
查看更多 >