Problem: mysql & mysqld cannot communicate (error 2003) Synopsis: (a) I installed mysql on a Unix SunOS system, but the post-installation died silently in mysql_install_db. There were no diagnostic messages. Trial-and-error indicated that mysql_install-db has a bug (a missing '&'). When this is patched, the script seems to work. (b) But I still can't get any response from mysql, only error 2003: Can't connect to MySQL server. I've search the documentation and the newsgroup archives fairly intensively. I can see that a number of other people have had the same or similar problem, but none of the proposed solutions have worked for me. I have now spent about about 15 hours just trying to get MySQL to do anything. Full details below. Any useful suggestions that I've not already tried would be appreciated.
System: Operating system: SunOS 5.6 on a Sun Ultra 5 MySql version: 3.22.30 Binary distribution: mysql-3_22_30-sun-sunos4_1_4-sparc_tar.gz Actions taken: (1) INSTALLATION 0. I installed a binary because I don't have C++ on my Unix box. I chose the SunOS-4 version of MySQL because that seemed closest to the SunOS-5 system that I am using. 1. The MySQL documentation recommends installing in /usr/local/ but this directory did not exist, and /usr is protected. So, I unprotected /usr and created /local. 2. I added the mysql command: shell> groupadd mysql shell> useradd -g mysql mysql 3. I attempted the specified unpacking command: shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - which in my case should be: shell> gunzip < /usr/local/mysql-3_22_30-sun-sunos4_1_4-sparc_tar.gz | tar xvf - This did not work. (a) gunzip was not recognised, but I found that gzip -d could be used instead. (b) tar kept on failing with the error message 'tar: directory checksum error'. I downloaded some other versions of MySQL but got the same error. After searching around the net, it seemed that I needed to use GNU tar. I downloaded GNU tar; it didn't work, but then I found a GNU tar already on the system called 'gtar' and used that. (I then noticed the completely uninformative sentence in the MySQL documentation: "Sun tar is known to have problems", which is meaningful only in retrospect.) So, I unpacked the MySQL files with: shell> gzip -d < /usr/local/mysql-3_22_30-sun-sunos4_1_4-sparc_tar.gz | tar xvf - and created a link to the new directory: shell> ln -s /usr/local/mysql-3_22_30-sun-sunos4_1_4-sparc mysql (2) POST-INSTALLATION 4. The online documentation recommends the next step should be shell> ./configure but the file INSTALL-BINARY in the distribution doesn't mention this and, looking inside the script 'configure', all it seems to do is run mysql_install_db, so I skipped this step. 4. Then I tried to set up the 'grant tables' shell> cd mysql shell> ./scripts/mysql_install_db This successfully sets some local variables as reported on the screen: Creating db table Creating host table Creating user table Creating func table Creating tables_priv table Creating columns_priv table And then nothing at all happens. It just freezes and stays frozen. At this point (judging from what is inside the script, mysqld has been started up and the table creation commands issued, but there has been no response. It's not clear whether it is still expecting input. I typed in various SQL commands as well as the end-of-input code, but got no response. Finally, I hit <CTRL-Z> and he process closed with 'Stopped (user)'. 4a. The standard failure message, 'Installation of grant tables failed!' was *not* produced. I believe this indicates that mysqld did not terminate. 4b. The (undisplayed) error message inside mysql_instal_db also suggested the following command to start the MySQL daemon: ./bin/mysqld --skip-grant & This did not succeed, as the parameter has to be --skip-grant-tables: ./bin/mysqld --skip-grant-tables & which seemed to work. But I still could not get any response from mysql. 4c. I read the relevant section of the online documentation (2.4.1 Problems Running mysql_install_db) but it had nothing to say about this situation. 4d. I therefore started looking through the archive of the newsgroup. I searched initially for 'mysql_install_db'. This yielded almost 2000 reports: the ones I looked at were all reporting problems identical or similar to mine, but without any solutions. I therefore restricted the search to 'mysql_install_db and SunOS', which reduced the set of messages to 53. These, too, were mostly reporting the same problem: mysql_install_db freezing up without any diagnostic messages. 4e. Looking at the script, it seems that, since the line does not end in '&', the daemon is executing in the foreground, so inevitably it will stay running forever (or until killed), and the code that follows this line (to report success or failure) will never be execute. To test this hypothesis, I tried the following: while the command window was frozen trying to run mysql_install_db, I killed the mysqld from another window. Immediately, the script stepped forward to the diagnostic message 'Installation of grant tables failed!'. My conclusion from this is that the script mysql_install_db has a bug in this respect (i.e. lacking '&'). To follow this up, I edited mysql_install_db, and appended '&' to the mysqld command line, and then tried again. This time, the script went through seemingly correctly. (C) MYSQLACCESS & MYSQLADMIN 5a. A suggestion in the documentation was to use the script 'mysqlaccess' to get some diagnostic information, but this failed to execute because it is a Perl script, and Perl does not seem to be installed on this Unix box. 5b. A suggestion from the help message for mysqld is to use shell> ./bin/mysqladmin variables but this command freezes with no diagnostic message. (D) PORT LOCK 6. While I was still working with the broken mysql_install_db, I tried again to run the daemon with: ./bin/mysqld --log --skip-grant-tables --basedir . & which failed with the message Can't start server: Bind on TCP/IP port: Address already in use Do you already have another mysqld server running on port: 3306 Aborting The command 'ps -e' showed that another instance of mysqld was running. I deleted the other instance of mysqld, and tried again. This seemed to get the daemon running; but mysql was still unresponsive. (E) ERROR FILES 7a. According to the documentation, a log should have been written to mysql/data/. In fact, this directory contained two sub-directories, 'mysql' and 'test', both of which were empty. (I later got some basic start and stop messages in mysql/data/wcm1s0m1.err by using the script safe_mysqld.) There was also a suggestion in the (undisplayed) error message inside the script that a log should be written to another place, '/var/db/mysql', but in fact the directory 'var' did not exist. 7b. Another suggestion was to start the MySQL daemon with shell> ./bin/safe_mysqld & This flashed up an error message and then immediately closed the command window, making it impossible to read the message. I captured the message by redirection, and it said that it was unable to move to the directory /usr/local/mysql/var. I therefore manually created the directory var and tried the command again. This time it seemed to work, and displayed the message: Starting mysqld daemon with databases from /usr/local/mysql-3.22.30-sun-sunos4.1.4-sparc/data There was still no log file in the 'data' directory. But: inside the directory 'var' I found the file wcm1s0m1.log (wcm1s0m1 being the name of the workstation). This file contained ./bin/mysqld, Version: 3.22.30-log, started with: Tcp port: 3306 Unix socket: /tmp/mysql.sock Time Id Command Argument This at least indicates the daemon was alive; but mysql was still unresponsive. 7c. I also tried safe_mysql, which wrote a line to data/wcm1s0m1.err: mysqld started on Wed Jun 5 10:23:15 EDT 2002 but no other messages were written to the file when executing mysql. 8a. The online documentation says that log files will by default go to /usr/local/var, but that they can be resent to /usr/local/mysql/var by means of this command: /configure --prefix=/usr/local/mysql Neither statement is true: the log file is going to usr/local/mysql/var anyway (provided that the directory has been manually created), and the script 'configure' does not handle any such change. (All it does is try to run mysql_install_db.) 8b. The online documentation also says that the log files can be sent to the correct directory, /usr/local/mysql/data, using this command: /configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data Again, this does not work for the same reason. (F) MySQL SHELL 9. I tried to access the MySQL command shell: ./bin/mysql -u root mysql On early attempts, this simply froze: no prompt, no output, and the user can type anything without any response until <CTRL-Z>. I'm not sure, but I think that those attempts were made when I had, at first, installed MySQL in a place other than /usr/local/mysql. I then deleted the installed files, and re-installed in /usr/local/mysql. But I can't be sure that that was when I stopped getting a frozen mysql and started getting error 2003. 10a. On later attempts, I obtained Error 2003: can't connect to MySQL server on 'localhost' 10b. The displayed output from mysql_install_db says a password should be set with: ./bin/mysqladmin -u root password 'new password' This, however, yields the message: ./bin/mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to MySQL server on 'localhist' (61)' Check that mysqld is running on localhost and that the port is 3306. You can check this by doing 'telnet localhost 3306'. which is a rather more informative diagnostic than mysql yields. 10c. Checking through the installation instructions in the online documentation, I noticed the following commands: shell> chown -R root . shell> chown -R mysql data shell> chgrp -R mysql . even though they were not listed in the distributed INSTALL-BINARY file. These failed in normal mode, but seemed to work in superuser. They did not, however, make any difference to the error 2003. 11a. One of the suggestions in the newsgroup archives was that /etc/hosts should be fixed to contain 172.0.0.1 localhost.localdomain hostname In fact, I checked my /etc/hosts file and it had 172.0.0.1 localhost is-to-oscar which looks OK to me. Another suggestion was to use the '-h' or '--host=' parameter, so I tried variously: ./bin/mysql -h localhost -u root mysql ./bin/mysql -h is-to-oscar -u root mysql ./bin/mysql -h 127.0.0.1 -u root mysql all of which failed with Error 2003. I also tried: ./bin/mysqladmin -h localhost -u root password 'new password' ./bin/mysqladmin -h is-to-oscar -u root password 'new password' ./bin/mysqladmin -h 127.0.0.1 -u root password 'new password' all of which failed as before. 11b. I tried the telnet option: telnet localhost 3306 telnet is-to-oscar 3306 telnet 127.0.0.1 3306 which all failed with: telnet: Unable to connect to remote host: Connection refused The only difference was that the third attempt yielded: Trying 127.0.0.1 .... before failing. I also pinged all three addresses (127.0.0.1, localhost, is-to-oscar) and was told that they were all alive. 11c. Following a suggestion in the newsgroup archive, I also tried 'resolveip'. (This is not a command, as suggested in the posting, but a script in mysql/bin.) This reported: ./bin/resolveip: Unable to find hostid for 'localhost' I also tried it with 'is-to-oscar' and '127.0.0.1', and got: ./bin/resolveip: Unable to find hostid for 'is-to-oscar' and Host name of 127.0.0.1 is localhost 11c. I did a search on the MySQL web site for 'can't connect', and one of the finds was: 4.2.11 (Causes of Access denied Errors). I think this probably refers to access denial *after* connection, rather than failure of connection; but anyway ...it recommended this: shell> mysql -u root test The 'mysql' command is not recognised, so I used: shell> ./bin/mysql -u root test which gave the same response (2003: Can't connect ...) 11d. The same section also said that the following file must exist: mysql/var/mysql/user.MYD I found that the directory mysql/var/mysql did not exist, so I created and inserted an empty file user.MYD. I then re-tried accessing mysql, but got the same respone (2003: Can't connect) 11e. The search also revealed: A.2.3 (Can't connect to [local] MySQL server Error), which recommends trying the following: shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` --port=3306 version shell> mysqladmin -h 'ip for your host' version shell> mysqladmin --socket=/tmp/mysql.sock version All of these fail with the same 2003 error, except for '-h 127.0.0.1', which just freezes. 12a. In A.2.3 (Can't connect to [local] MySQL server Error), there is a suggestion of using sockets by means of the parameter '--skip-networking' when starting up mysqld. In 4.1.1 (mysqld Command-line Options), we find for '--skip-networking': "This option is highly recommended for systems where only local requests are allowed" (i.e. instead of TCP/IP). I therefore inserted this in the command line in mysql_install_db. I retried mysql but it made no difference: I still got error 2003. 12b. This section also states that the default socket file is /tmp/mysqld.sock, and not /tmp/mysql.sock as stated elsewhere. I therefore created a link: shell> ln -s /tmp/mysql.sock /tmp/mysqld.sock I then retried mysql with both socket names but it made no difference: shell> mysqladmin --socket=/tmp/mysql.sock version shell> mysqladmin --socket=/tmp/mysqld.sock version I still get error 2003. I also added an explicit parameter '--socket=/tmp/mysql.sock' in the script mysql_install_db. It still made no difference to error 2003. Also, more than one posting stated that mysqld creates the file /tmp/mysql.sock when it starts up. Well, I tried deleting the socket file and starting up mysqld, and I found that it did *not* create mysql.sock. It has to be created manually if it is to exist at all. 12c. I issued the command shell> netstat -av The output table did not mention mysql.sock or mysqld.sock, and therefore suggests that MySQL's socket is not active. 12d. A posting on the MySQL suggested that the problem could be caused by inadequate access permissions on the socket file. So I used chmod to full world access to /tmp and /tmp/mysql.sock. This made no difference. 12e. Another posting in mysql.list suggested that mysqld needs to create mysql.sock in mysql/var/lib/mysql. That directory did not exist, so I created it and restarted mysqld. This made no difference. mysql.lock did not appear in that directory, and I still get error 2003. Several postings are adamant that mysqld creates the socket file, but this simply doesn't happen. Maybe that is a clue: do I need to tweak something else to get mysqld to create the socket file? 12f. I noticed that, even though I'm trying to use a socket connection, I keep getting this error: ERROR 2003: Can't connect to MySQL server on 'localhost' (61) but other people posting on usenet get this error: ERROR 2002: Can't connect to local MySQL server through socket '...path...'(111) It looks as though mysql is still trying to use TCP/IP even though I want it to use a socket. From the mysql help listing, the only relevant parameter seems to be '--socket=path', so I tried this: ./bin/mysql --socket=/tmp/mysql.sock -u root test But I still get error 2003. I also tried ./bin/mysql --socket=/tmp/mysql.sock --host='' -u root test but to no avail: I still get error 2003 saying it can't connect to 'localhost'. 12g. One posting suggested that the executable may have been compiled with "pthreads instead of native threads", which would mean that it could not use Unix sockets. Instead, it would have to use TCP/IP. I don't know how my binary was compiled. (It's not documented on mysql.com.) So, I tried to switch to using TCP/IP. I killed the server mysqld, edited the script mysql_install_db to replace '--skip-networking --socket=/tmp/mysql.sock' with '--skip-name-resolve'. I then retried mysql: shell> ./bin/mysql -h 127.0.0.1 -u root test I still got the error 2003. There is another experiment that I ran to test this possibility, as follows. If I try to to run multiple instances of the server using TCP/IP, by issuing the command: shell> ./bin/mysqld & then on the 2nd and subsequent attempts I get the error message: Can't start server: Bind in TCP/IP port: Address already in use. Do you already have another mysqld server running on port 3306? But, if I start up multiple instances of the server ostensibly with socket access: shell> ./bin/mysqld --skip-networking & then I don't get that error message. To be sure, that doesn't *prove* that this executable can use sockets, but it is circumstantial evidence that at least the server executable doesn't try to use TCP/IP when given the --skip-networking flag. 12h. In one of the help messages, it says that there are three files where socket-related things might be set (although, unfortunately, it did not say which took precedence, the files or the command-line arguments). /etc/my.cnf mysql/data/my.cnf ~/.my.cnf In fact, none of these files exist. --- I am running out of things to try. At present, the only candidate explanation is that the mysql and mysqld executables were compiled using pthreads, and that the client mysql keeps on trying to reach the server through a TCP/IP connection even when told to use sockets. But that doesn't explain why the client still can't talk with the server when I specify to use TCP/IP. Given that this is supposed to be an easy installation, I'm a little disappointed in MySQL, and hope somebody out there has some constructive suggestions ... --- Some suggested fixes: a. The documentation should specify that tar fails with the misleading message that the tar file is corruprt; and it should advise people to use gtar instead. b. The script mysql_install_db is incorrect, and should have '&' at the end of the mysqld command line. c. Documentation (online and in-distribution) that refers to the parameter '--skip-grant' is incorrect, and should be changed to '--skip-grant-tables'. d. The advice to use sockets rather than TCP/IP for connecting to a server on the local machine should surely be stated in the main part of the installation instructions, not tucked away in an appendix. e. Section A.2.3 (Can't connect to [local] MySQL server Error) refers to 2002 only, not 2003. If both messages are possible, it should discuss them both. f. Documentation incorrectly states default location of error file, and use of the 'configure' script to change it. Peter Lloyd --- mysqlbug form --- From: Peter Lloyd <[EMAIL PROTECTED]> To: [EMAIL PROTECTED] Subject: Error 2003: mysql and mysqld not talking to one another >Description: Trying to run mysql always fails with error 2003: can't connect with server. >How-To-Repeat: ./bin/mysql -u root test >Fix: Not known. >Submitter-Id: [EMAIL PROTECTED] >Originator: Peter Lloyd >Organization: Nortel Networks >MySQL support: none >Synopsis: Trying to run mysql always fails with error 2003: can't connect with >server. >Severity: critical >Priority: high >Category: mysql >Class: support >Release: mysql-3.22.30 (TCX binary) >Environment: System: SunOS wcm1s0m1 5.6 Generic_105181-19 sun4u sparc SUNW,Ultra-5_10 Architecture: sun4 Some paths: /opt/bin/perl /usr/ccs/bin/make /opt/SUNWspro/bin/cc Compilation info: CC='gcc' CFLAGS='-O2 -fomit-frame-pointer' CXX='gcc' CXXFLAGS='-O2 -fomit-frame-pointer' LDFLAGS='' Configure command: ./configure --prefix=/usr/local/mysql '--with-comment=TCX binary' --disable-shared Perl: This is perl, version 5.005_02 built for sun4-solaris --- End of form --- --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php