MySQL数据库无法启动怎么办?
本文适用于,mysql无法启动,但数据文件未丢失的情况。
Mysql因意外情况,导致无法启动,数据库未做备份的情况下,如何将数据迁移至其他数据库中。
原数据库地址:192.168.1.100(以下简称A服务器)
新数据库地址:192.168.2.100(以下简称B服务器)
数据恢复流程:
进入A服务器,输入命令
cat /etc/my.cnf
(如文件不在当前位置,可使用find / -name my.cnf 命令查询文件位置)找到
datadir
路径通过
cd /www/server/data
命令,进入数据文件夹。当前文件夹里面就是mysql中所有库的数据文件存放位置。
下面以bus文件夹中文件,演示具体如何恢复文件。
进入B服务器,创建与A服务器bus库,用户名,密码相同的库。创建成功后,通过上面方法,进入数据文件目录,也会出现一个bus文件夹。
停止B服务器mysql服务,将A服务器中bus文件夹中,除db.opt文件外的其他文件打包,发送至B服务器数据目录的bus文件夹中。解压。
通过命令行,将/www/server/data/bus文件夹的所有者和组,更改成mysql
更改所有者
更改组
更改成功后,启动B服务器数据库,进入数据库后,如提示
error: 1146: Table doesn't exist,
还需将A服务器,数据文件夹中ibdata1 文件,拷贝至B服务器相应位置,同时更改相应的所有者和组权限。至此,数据文件恢复数据库工作完成,
注1:如未改动数据文件夹所有者和组,启动数据库后,进入bus库点击相应表名会出现 ERROR #1017 :Can't find file: '/xxx.frm' 错误或ERROR #1036 Table '表名' is read only
注2:如数据库较多,可能会发现,部分数据库文件中有.frm .MYD .MYI这三种文件,部分数据库中只有.frm文件,这是因为MySQL存储表的时候,使用的默认数据库存储引擎是InnoDB,而使用InnoDB存储引擎的时候,是不生成.MYD 和.MYI文件的。
mysql判断表是否存在不存在就创建?
CREATETEMPORARYtableIFNOTEXISTSalarmLeveltb(devIDbigintnotnull,alarmLevelbigintnotnull);truncateTABLEalarmLeveltb;--清空表中的数据其中:alarmLeveltb为临时表的名称。小括号内的是该临时表的定义。功能:判断临时表alarmleveltb是否存在,若不存在则创建临时表alarmLeveltb。
如何判断MySQL、Oracle、PostgreSql数据库中某表或字段是否存在?
我是点点小萱,这个问题我来回答。
MySQL
MySQL是一个关系型数据库管理系统。因为MySQL是开放源码的,所以一般的中小型网站的开发都选择将MySQL作为网站数据库,这样可以大大降低总体拥有的成本。
那么下面来看看,MySQL中,是怎么判断数据库中表或者字段是否存在的。
查看表是否存在总共有3种方法:
先进入到要查看表的某个数据库
①查看数据库所有的表:
SHOW TABLES;
这个会列出所有的数据库表名。
②根据数据库名称查看表是否存在
SHOW TABLES LIKE 'table_name';
③通过MySql自带的数据库information_schema查看表
SELECT COUNT(*) FROM information_schema.TABLES WHERE table_name = 'table_name';
注意:另外我们在创建表的时候,会经常用到这样的一句sql:
drop table if exists table_name;
如果存在表则先删除该表。
查看表中某个字段是否存在有3种方法:
①describe命令查看表的详细设计
describe table_name;
该语句会列出表中所有的字段信息。
②describe命令查询具体列(字段)的信息
describe table_name column;
表中某列的具体信息。
③通过"show comnus"命令来查看数据库中表的列名:
show columns from database_name.table_name
或者show columns form table_name from database_name
Oracle
Oracle是一个关系数据库管理系统。Oracle数据库可移植性好、使用方便、功能强大,使用于各个领域的大、中、小、微机环境,在数据库领域一直处于领先地位。
查看表是否存在有2种方法:
①查看当前登录用户中的所有表中是否存在该表
select count(*) from user_tables where table_name =upper('table_name');
注意表名区分大小写,如果参数不限制,那这里就必须要加上函数。
②查询某个用户下的表中是否存在该表
select count(*) from all_tables where owner = UPPER('用户') and table_name = upper('table_name');
这个语句可以在当前用户下查询其他用户下的表信息。
查看表中某个字段是否存在有2种方法:
①通过获取表中的字段来判断
select * from user_tab_columns where table_name='表名' order by column_name;
会列出该表中所有的字段信息。
②直接根据字段名称来查询
select count(*) from user_tab_columns where table_name= '表名' and column_name= '字段名';
如果存在count的值就是1,如果不存在就是0。
PostgreSql
PostgreSql是一个对象关系型数据库管理系统。它支持大部分的SQL标准语法,并且支持复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等特性。
查看表是否存在有2种方法:
①使用pg_class系统表来查找
select count(*) from pg_class where relname = 'table_name';
②
information_schema.tables
来查找select count(*) from information_schema.tables where table_schema='public' and table_type='BASE TABLE' and table_name='table_name';
查看表中某个字段是否存在有2种方法:
①通过获取表中所有的字段来判断
select column_name,data_type,character_maximum_length,numeric_precision,
numeric_scale from information_schema.COLUMNS WHERE table_schema = 'public' and table_name = 'table_name' GROUP BY column_name,data_type,character_maximum_length,numeric_precision,numeric_scale;
会列出该表中所有的字段信息。
②直接根据字段名称来查询
select count(*) from information_schema.columns WHERE table_schema = 'table_schema' and table_name = 'table_name' and column_name = 'column_name';
如果存在count的值就是1,如果不存在就是0。
以上就是小编的回答了,纯属个人观点,如有不足之处,欢迎点评、建议。
我是点点小萱。