Linux系统mysql密码和远程访问设置

 

一、设置或重置MySql密码

Mysql刚刚安装完成,密码是空的,直接回车可以登录。

方法一:最简单的方法,也是安装完mysql后,系统提示的方法。使用mysqladmin来完成。shell> mysqladmin -u root password “newpwd”

shell> mysqladmin -u root -h host_name password “newpwd”password后面的双引号不是必须的,不过如果密码包含空格或者一些特殊的符号,需要用引号。方法二:利用mysql里面的SET PASSWORD命令来完成,注意必须使用PASSWORD()函数来加密设置的这个newpwd,否则直接=’newpwd’不会生效。不过如果使用方法一用mysqladmin password设置密码或者用GRANT来设置,就不用使用PASSWORD()函数,因为它们已经自动调用了该函数。shell> mysql -u root

mysql> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpwd’);

mysql> SET PASSWORD FOR ‘root’@’host_name’ = PASSWORD(‘newpwd’);

方法三:直接通过UPDATE user表来设置密码shell> mysql -u root

mysql> UPDATE mysql.user SET Password = PASSWORD(‘newpwd’)

-> WHERE User = ‘root’;

mysql> FLUSH PRIVILEGES;

如果忘记mysql的root密码可以采取下面的步骤重新设置

1。kill掉所有mysql的进程

2。使用–skip-grant-tables的参数启动mysql

shell> mysqld_safe –skip-grant-tables &

3。设置新的密码,同样两种方式可以选择

方法一

shell> mysqladmin -u root flush-privileges password “newpwd”

方法二

mysql> UPDATE mysql.user SET Password=PASSWORD(‘newpwd’)

-> WHERE User=’root’;

mysql> FLUSH PRIVILEGES;

4。停止mysql server,用正常的模式启动

5。OK,可以使用新设置的密码了

二、配置远程访问

Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作:

/etc/mysql/my.cnf

bind-address= 127.0.0.1//要改成你的外网ip


1、允许root用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如下:
在本机先使用root用户登录mysql:
mysql -u root -p”youpassword” 
进行授权操作:
mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘youpassword’ WITH GRANT OPTION;
重载授权表:
FLUSH PRIVILEGES;
退出mysql数据库:
exit


2、允许root用户在一个特定的IP进行远程登录,并具有所有库任何操作权限,具体操作如下:
在本机先使用root用户登录mysql:
mysql -u root -p”youpassword” 
进行授权操作:
GRANT ALL PRIVILEGES ON *.* TO [email protected]”172.16.16.152″ IDENTIFIED BY “youpassword” WITH GRANT OPTION;
重载授权表:
FLUSH PRIVILEGES;
退出mysql数据库:
exit


3、允许root用户在一个特定的IP进行远程登录,并具有所有库特定操作权限,具体操作如下:
在本机先使用root用户登录mysql:
mysql -u root -p”youpassword” 
进行授权操作:
GRANT select,insert,update,delete ON *.* TO [email protected]”172.16.16.152″ IDENTIFIED BY “youpassword”;
重载授权表:
FLUSH PRIVILEGES;
退出mysql数据库:
exit


4、删除用户授权,需要使用REVOKE命令,具体命令格式为:
REVOKE privileges ON 数据库[.表名] FROM user-name;
具体实例,先在本机登录mysql:
mysql -u root -p”youpassword” 
进行授权操作:
GRANT select,insert,update,delete ON TEST-DB TO [email protected]”172.16.16.152″ IDENTIFIED BY “youpassword”;
再进行删除授权操作:
REVOKE all on TEST-DB from test-user;
****注:该操作只是清除了用户对于TEST-DB的相关授权权限,但是这个“test-user”这个用户还是存在。
最后从用户表内清除用户:
DELETE FROM user WHERE user=”test-user”;
重载授权表:
FLUSH PRIVILEGES;
退出mysql数据库:
exit

5、MYSQL权限详细分类:
全局管理权限: 
FILE: 在MySQL服务器上读写文件。 
PROCESS: 显示或杀死属于其它用户的服务线程。 
RELOAD: 重载访问控制表,刷新日志等。 
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限: 
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。 
CREATE: 建立新的数据库或数据表。 
DELETE: 删除表的记录。 
DROP: 删除数据表或数据库。 
INDEX: 建立或删除索引。 
INSERT: 增加表的记录。 
SELECT: 显示/搜索表的记录。 
UPDATE: 修改表中已存在的记录。
特别的权限: 
ALL: 允许做任何事(和root一样)。 
USAGE: 只允许登录–其它什么也不允许做。

SqlServer2012新函数TRY_CONVERT不存在的问题解决

今天开发中在select列中使用convert把字符串转换成日期格式,有些字符串转换会报错,造成翻页翻着翻着就会500错误,由于需要生日字符串转换年龄还要排序,所以又无法在c#李转换.

我想c#里有tryparse,sql里搞不好也有。好在发现了有TRY_CONVERT 函数的存在,运行语句测试报错:

问题描述.
我们在SQL Server Management Studio中对数据库在SQL Server2012实例,试图运行下面的SELECT语句时:

SELECT TRY_CONVERT(date, ‘birthday’)

接收到服务端报错:(我是英文数据库服务器,中文可能是该函数没有定义)

Msg 195, Level 15, State 10, Line 1
‘TRY_CONVERT’ is not a recognized built-in function name.

 

造成原因.

这个sql语句不能够运行在 SQL Server 2005 (90)或SQL Server 2008 (100)的兼容级别.

 

解决办法.

数据库上右键, 选择属性, 然后切换到选项页, 修改数据库的兼容级别为sql2012( 110).

修改兼容级别到110后, 查询就可以成功了.

 

另外,如果没有权限进入数据库属性设置页的话,也可以通过sql命令修改:

Oracle中存储过程传入按逗号分割的数值参数时报错的问题

前两天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。
但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from table_name_1 where id in (1,2,3,4,5),其中的1,2,3,4,5即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (1,2,3,4,5)这条语句会认为1,2,3,4,5是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将1,2,3,4,5判定为‘1,2,3,4,5’,而’1,2,3,4,5’是一个字符串,这时候sql执行的实际上是select * from table_name_1 where id in (‘1,2,3,4,5’),而id是一个number型的,这时候就会报错。
原存储过程大致如下:

如上述的存储过程,由于传入的参数an_id是一个number型的,如果是一个单独的数字,过程执行没有问题,但如果是一个字符串,如’1,2,3,4,5’,这样就会报错,因为’1,2,3,4,5’是一个varchar。
如果将传入的参数an_id 改为varchar型的,如create or replace procedure test_prc(an_id in varchar),这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是’1,2,3,4,5’,这时候,也会报错。
这种情况据我所知可以有两种方法来解决,第一种是使用动态sql;第二种是使用instr函数来解决。有的朋友使用的是动态sql,我没使用这种方法,第一是自己不太会写,第二是觉得太繁琐。这里重点说的是使用instr函数。以后可能也会尝试使用动态sql来试试看,到时候再来更新吧。
其实使用instr函数也没有什么多说的,仔细看懂了理解了就行了,先贴出结果吧。

INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上’,’,是为去掉当查询11的时候,会将1和11都取出来。
至此,问题解决。

SqlServer查询字符串聚集 for xml

sqlserver提供了一系列将查询结果的其中一列的聚集函数,不如Sum(),Avg()等等,这些都是针对数据聚集的函数。那么有没有字符串聚集的函数呢?

没有这样的内置函数,一直以来只能通过自定义函数来实现。

但是sqlserver05以后有了一个比较完美的解决办法,使用for xml path来取以逗号分隔的多行数据的应用
for xml有两个修饰符,还有两个修饰符,一共有四种,分别是:
1、RAW
2、AUTO
3、PATH
4、EXPLICIT
基本上是按照功能的强弱正序排列的,闲话少说,直接看代码:

关于SQL Server 中合并行的方法

————-参考————————

—-假设我们有如下数据表
——菜系表————
–店名        菜系——
–澳门豆捞    川菜
–澳门豆捞    粤菜
–澳门豆捞    闽菜
–为民大酒店  鲁菜
–为民大酒店  粤菜
–为民大酒店  川菜
———————–

——-执行如下语句

——-结果如下————-
–店名        菜系———-
–澳门豆捞    川菜,闽菜,粤菜
–为民大酒店  川菜,鲁菜,粤菜
—————————-

————————————————————————————–
Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数,
其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符,然后将expression2插入到expression1_Str中的startIndex位置。startIndex 从1开始
数据库表中有三个字段,要以xxxx-xxxxxx-xxxxxx的格式输出,其中不满相应位数的,在后面补空格,即把类似23,1234,879这样的三个数以如下形式输出到报表中:23__-1234__-879___的格式输出,标注颜色的下划线一种颜色代表一个空格。
STUFF(SPACE(4),1,LEN(‘23’),’23’)+’-’+STUFF(SPACE(6),1,LEN(‘1234’),’1234’)+’-’+ STUFF(SPACE(6),1,LEN(‘879’),’879’),转换结果自然就为23__-1234__-879___了。
Stuff函数另一种解释

示例:

从第二个字符开始,删掉一个字符,然后用’F’代替删掉字符的位置,如果不需要删掉字符,则将<length to delete from string 1>设为0即可。
注意:如果<starting position>或<length to delete from string 1 >是负的,或者<starting position>是大于<string 1>长度的数,则STUFF函数将返回NULL,如果指令的<length to delete from string 1>长于从<starting position>位置到<string 1>结尾的字符数,此函数将<string 1 >在<starting position-1>处截断

—————————————————————————
FOR XML PATH 语句的应用
大家都知道在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用示例。

运行这段脚本,将生成如下结果:

大家可以看到两行数据生成了两个节点,修改一下PATH的参数:

再次运行上述脚本,将生成如下的结果:

可以看到节点变成,其实PATH() 括号内的参数是控制节点名称的,这样的话大家可以看一下如果是空字符串(不是没有参数)会是什么结果?

执行上面这段脚本将生成结果:

这样就不显示上级节点了,大家知道在 PATH 模式中,列名或列别名被作为 XPath 表达式来处理,也就是说,是列的名字,这样大胆试验一下不给指定列名和别名会是怎么样?

运行上面这句将生成结果

1a2b

所有数据都生成一行,而且还没有连接字符,这样的数据可能对大家没有用处,还可以再变化一下:

生成结果

1,a;2,b;

大家现在明白了吧,可以通过控制参数来生成自己想要的结果,例如:

生成结果

{1,”a”}{2,”b”}

还可以生成其他格式,大家可以根据自己需要的格式进行组合。

下面是一个数据统计的应用,希望大家可以通过下面的实例想到更多的应用

生成结果(每个城市的用户名)

北京 b,d
上海 a,c,e

SQL如何按字段删除重复记录

Oracle数据导入导出imp/exp-备份恢复

 

功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份。大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢失)。

  Oracle有个好处,虽然你的电脑不是服务器,但是你装了oracle客户端,并建立了连接 (通过net8 assistant中本地——>服务命名 添加正确的服务命名

  其实你可以想成是客户端与服务器端修了条路,然后数据就可以被拉过来了)这样你可以把数据导出到本地,虽然可能服务器离你很远。你同样可以把dmp文件从本地导入到远处的数据库服务器中。

  利用这个功能你可以构建俩个相同的数据库,一个用来测试,一个用来正式使用。

  执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,DOS中可以执行时由于 在oracle 8i 中  安装目录\ora81\BIN被设置为全局路径,该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。

  oracle用java编写,我想SQLPLUS.EXE、EXP.EXE、IMP.EXE这俩个文件是被包装后的类文件。SQLPLUS.EXE调用EXP.EXE、IMP.EXE他们所包裹的类,完成导入导出功能。

  下面介绍的是导入导出的实例,向导入导出看实例基本上就可以完成,因为导入导出很简单。

  数据导出:

  1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中

1 exp system/[email protected] file=d:\daochu.dmp full=y

  2 将数据库中system用户与sys用户的表导出

1 exp system/[email protected] file=d:\daochu.dmp owner=(system,sys)

  3 将数据库中的表table1 、table2导出

1 exp system/[email protected] file=d:\daochu.dmp tables=(table1,table2)

  4 将数据库中的表table1中的字段filed1以"00"打头的数据导出

1 exp system/[email protected] file=d:\daochu.dmp tables=(table1) query=\" where filed1 like'00%'\"

  上面是常用的导出,对于压缩我不太在意,用winzip把dmp文件可以很好的压缩。

  不过在上面命令后面 加上 compress=y  就可以了

  数据的导入1 将D:\daochu.dmp 中的数据导入 TEST数据库中。

1 imp system/[email protected]  file=d:\daochu.dmp

  上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

  在后面加上 ignore=y 就可以了。

  2 将d:\daochu.dmp中的表table1 导入

1 imp system/[email protected]  file=d:\daochu.dmp  tables=(table1)

  基本上上面的导入导出够用了。不少情况我是将表彻底删除,然后导入。

  注意:

  你要有足够的权限,权限不够它会提示你。

  数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。

JDBC(或Hibernate)调用Oracle存储过程

1、存储过程

包头:

包体:

2、JDBC调用存储过程

3、Hibernate调用存储过程

在hbm文件里要配置

用java调用oracle存储过程总结

这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。

一:无返回值的存储过程

存储过程为:

然后呢,在java里调用时就用下面的代码:

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)

存储过程为:

在java里调用时就用下面的代码:

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,

1,  建一个程序包。如下:

2,建立存储过程,存储过程为:

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。

在java里调用时就用下面的代码:

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。