|
Technical Interview Questions
Oracle Interview Questions
MySql
Interview Questions
MsSql Interview Questions
JDBC
Interview Questions
.........More
Soft Skills
Communication Skills
Leadership Skills
.........More
|
|
My SQL Interview Questions and Answers
MySQL - Setting Up Passwords
In most cases you should use GRANT to set up your
users/passwords, so the following only applies for
advanced users.
The examples in the preceding sections illustrate an
important principle: when you store a non-empty password
using INSERT or UPDATE statements, you must use the
PASSWORD() function to encrypt it. This is because the
user table stores passwords in encrypted form, not as
plaintext. If you forget that fact, you are likely to
attempt to set passwords like this:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
The result is that the plaintext value 'biscuit' is
stored as the password in the user table. When the user
jeffrey attempts to connect to the server using this
password, the mysql client encrypts it with PASSWORD()
and sends the result to the server. The server compares
the value in the user table (the encrypted value of
'biscuit') to the encrypted password (which is not
'biscuit'). The comparison fails and the server rejects
the connection:
shell> mysql -u jeffrey -pbiscuit test
Access denied
Passwords must be encrypted when they are inserted in
the user table, so the INSERT statement should have been
specified like this instead:
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
You must also use the PASSWORD() function when you use
SET PASSWORD statements:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
If you set passwords using the GRANT ... IDENTIFIED BY
statement or the mysqladmin password command, the
PASSWORD() function is unnecessary. They both take care
of encrypting the password for you, so you would specify
a password of 'biscuit' like this:
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY
'biscuit';
or
shell> mysqladmin -u jeffrey password biscuit
NOTE: PASSWORD() does not perform password encryption in
the same way that Unix passwords are encrypted. You
should not assume that if your Unix password and your
MySQL password are the same, that PASSWORD() will result
in the same encrypted value as is stored in the Unix
password file.
MySQL - Causes of Access denied Errors
If you encounter Access denied errors when you try to
connect to the MySQL server, the list below indicates
some courses of action you can take to correct the
problem:
The server should let you connect without error. You
should also make sure you have a file `user.MYD' in the
MySQL database directory. Ordinarily, this is `PATH/var/mysql/user.MYD',
where PATH is the pathname to the MySQL installation
root.
After a fresh installation, you should connect to the
server and set up your users and their access
permissions:
shell> mysql -u root mysql
The server should let you connect because the MySQL root
user has no password initially. That is also a security
risk, so setting the root password is something you
should do while you're setting up your other MySQL
users. If you try to connect as root and get this error:
Access denied for user: '@unknown' to database mysql
this means that you don't have an entry in the user
table with a User column value of 'root' and that mysqld
cannot resolve the hostname for your client. In this
case, you must restart the server with the
--skip-grant-tables option and edit your `/etc/hosts' or
`\windows\hosts' file to add an entry for your host.
If you updated an existing MySQL installation from a
version earlier than Version 3.22.11 to Version 3.22.11
or later, did you run the mysql_fix_privilege_tables
script? If not, do so. The structure of the grant tables
changed with MySQL Version 3.22.11 when the GRANT
statement became functional.
If you can't get your password to work, remember that
you must use the PASSWORD() function if you set the
password with the INSERT, UPDATE, or SET PASSWORD
statements. The PASSWORD() function is unnecessary if
you specify the password using the GRANT ... INDENTIFIED
BY statement or the mysqladmin password command.
localhost is a synonym for your local hostname, and is
also the default host to which clients try to connect if
you specify no host explicitly. However, connections to
localhost do not work if you are running on a system
that uses MIT-pthreads (localhost connections are made
using Unix sockets, which are not supported by MIT-pthreads).
To avoid this problem on such systems, you should use
the --host option to name the server host explicitly.
This will make a TCP/IP connection to the mysqld server.
In this case, you must have your real hostname in user
table entries on the server host. (This is true even if
you are running a client program on the same host as the
server.)
If you get an Access denied error when trying to connect
to the database with mysql -u user_name db_name, you may
have a problem with the user table. Check this by
executing mysql -u root mysql and issuing this SQL
statement:
mysql> SELECT * FROM user;
The result should include an entry with the Host and
User columns matching your computer's hostname and your
MySQL user name.
The Access denied error message will tell you who you
are trying to log in as, the host from which you are
trying to connect, and whether or not you were using a
password. Normally, you should have one entry in the
user table that exactly matches the hostname and user
name that were given in the error message. For example
if you get an error message that contains Using
password: NO, this means that you tried to login without
an password.
If you get the following error when you try to connect
from a different host than the one on which the MySQL
server is running, then there is no row in the user
table that matches that host:
Host ... is not allowed to connect to this MySQL server
You can fix this by using the command-line tool mysql
(on the server host!) to add a row to the user, db, or
host table for the user/hostname combination from which
you are trying to connect and then execute mysqladmin
flush-privileges. If you are not running MySQL Version
3.22 and you don't know the IP number or hostname of the
machine from which you are connecting, you should put an
entry with '%' as the Host column value in the user
table and restart mysqld with the --log option on the
server machine. After trying to connect from the client
machine, the information in the MySQL log will indicate
how you really did connect. (Then replace the '%' in the
user table entry with the actual hostname that shows up
in the log. Otherwise, you'll have a system that is
insecure.) Another reason for this error on Linux is
that you are using a binary MySQL version that is
compiled with a different glibc version than the one you
are using. In this case you should either upgrade your
OS/glibc or download the source MySQL version and
compile this yourself. A source RPM is normally trivial
to compile and install, so this isn't a big problem.
If you get an error message where the hostname is not
shown or where the hostname is an IP, even if you try to
connect with a hostname:
shell> mysqladmin -u root -pxxxx -h some-hostname ver
Access denied for user: 'root' (Using password: YES)
This means that MySQL got some error when trying to
resolve the IP to a hostname. In this case you can
execute mysqladmin flush-hosts to reset the internal DNS
cache. Some permanent solutions are:
Try to find out what is wrong with your DNS server and
fix this.
Specify IPs instead of hostnames in the MySQL privilege
tables.
Start mysqld with --skip-name-resolve.
Start mysqld with --skip-host-cache.
Connect to localhost if you are running the server and
the client on the same machine.
Put the client machine names in /etc/hosts.
If mysql -u root test works but mysql -h your_hostname
-u root test results in Access denied, then you may not
have the correct name for your host in the user table. A
common problem here is that the Host value in the user
table entry specifies an unqualified hostname, but your
system's name resolution routines return a fully
qualified domain name (or vice-versa). For example, if
you have an entry with host 'tcx' in the user table, but
your DNS tells MySQL that your hostname is 'tcx.subnet.se',
the entry will not work. Try adding an entry to the user
table that contains the IP number of your host as the
Host column value. (Alternatively, you could add an
entry to the user table with a Host value that contains
a wild card--for example, 'tcx.%'. However, use of
hostnames ending with `%' is insecure and is not
recommended!) If mysql -u user_name test works but mysql
-u user_name other_db_name doesn't work, you don't have
an entry for other_db_name listed in the db table.
If mysql -u user_name db_name works when executed on the
server machine, but mysql -u host_name -u user_name
db_name doesn't work when executed on another client
machine, you don't have the client machine listed in the
user table or the db table. If you can't figure out why
you get Access denied, remove from the user table all
entries that have Host values containing wild cards
(entries that contain `%' or `_'). A very common error
is to insert a new entry with Host='%' and User='some
user', thinking that this will allow you to specify
localhost to connect from the same machine. The reason
that this doesn't work is that the default privileges
include an entry with Host='localhost' and User=''.
Because that entry has a Host value 'localhost' that is
more specific than '%', it is used in preference to the
new entry when connecting from localhost! The correct
procedure is to insert a second entry with Host='localhost'
and User='some_user', or to remove the entry with Host='localhost'
and User=''.
If you get the following error, you may have a problem
with the db or host table:
Access to database denied
If the entry selected from the db table has an empty
value in the Host column, make sure there are one or
more corresponding entries in the host table specifying
which hosts the db table entry applies to. If you get
the error when using the SQL commands SELECT ... INTO
OUTFILE or LOAD DATA INFILE, your entry in the user
table probably doesn't have the file privilege enabled.
Remember that client programs will use connection
parameters specified in configuration files or
environment variables. If a client seems to be sending
the wrong default connection parameters when you don't
specify them on the command line, check your environment
and the `.my.cnf' file in your home directory. You might
also check the system-wide MySQL configuration files,
though it is far less likely that client connection
parameters will be specified there. If you get Access
denied when you run a client without any options, make
sure you haven't specified an old password in any of
your option files!
If you make changes to the grant tables directly (using
an INSERT or UPDATE statement) and your changes seem to
be ignored, remember that you must issue a FLUSH
PRIVILEGES statement or execute a mysqladmin
flush-privileges command to cause the server to re-read
the privilege tables. Otherwise your changes have no
effect until the next time the server is restarted.
Remember that after you set the root password with an
UPDATE command, you won't need to specify it until after
you flush the privileges, because the server won't know
you've changed the password yet!
If you have access problems with a Perl, PHP, Python, or
ODBC program, try to connect to the server with mysql -u
user_name db_name or mysql -u user_name -pyour_pass
db_name. If you are able to connect using the mysql
client, there is a problem with your program and not
with the access privileges. (Note that there is no space
between -p and the password; you can also use the
--password=your_pass syntax to specify the password. If
you use the -p option alone, MySQL will prompt you for
the password.)
For testing, start the mysqld daemon with the
--skip-grant-tables option. Then you can change the
MySQL grant tables and use the mysqlaccess script to
check whether or not your modifications have the desired
effect. When you are satisfied with your changes,
execute mysqladmin flush-privileges to tell the mysqld
server to start using the new grant tables. Note:
Reloading the grant tables overrides the
--skip-grant-tables option. This allows you to tell the
server to begin using the grant tables again without
bringing it down and restarting it.
If everything else fails, start the mysqld daemon with a
debugging option (for example, --debug=d,general,query).
This will print host and user information about
attempted connections, as well as information about each
command issued.
If you have any other problems with the MySQL grant
tables and feel you must post the problem to the mailing
list, always provide a dump of the MySQL grant tables.
You can dump the tables with the mysqldump mysql
command. As always, post your problem using the mysqlbug
script.
Page Numbers : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Have a Question ?
post your questions here. It
will be answered as soon as possible.
Check
Job Interview Questions
for more Interview Questions with Answers
|