Psycopg2 reporting pg_hba.conf error - python

I've run into a weird situation while trying to use PostgreSQL and Psycopg2. For some reason, every time I attempt to connect to the postgre database via python, I get the following error:
psycopg2.OperationalError: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "steve", database "steve", SSL on
FATAL: no pg_hba.conf entry for host "127.0.0.1", user "steve", database "steve", SSL off
Naturally, I checked pg_hba.conf to see what the issue was, but everything appeared to be configured correctly as far as I can see:
pg_hba.conf:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
In addition, I've found that I can connect to the database via psql as I would expect:
$ psql -U steve -h 127.0.0.1
...
steve=>
Anyone have any ideas as to what could be going on here? Thanks in advance!

Typical explanations include:
You are connecting to the wrong server.
Is the DB server running on the same host as Python does?
You got the wrong port.
Check the server log if you see a connection attempt. You have to log connections for that, of course. See the config parameter log_connections.
You did not reload (SIGHUP) the server after changing pg_hba.conf - or reloaded the wrong cluster (if you have multiple DB clusters).
Use pg_ctl or pg_ctlcluser on Debian and derivatives for that.
Or, on modern Linux installations with systemd (incl. Debian & friends), typically:
sudo systemctl reload postgresql
Or, if there are multiple installations, check with:
sudo systemctl status postgres*
And then realod the one you want with something like:
sudo systemctl reload postgresql#14-main

I recently got into this same issue and I found the solution for this problem.
System:
I have an application server (with these packages installed python, django, psycopg2 and postgres client 9.6.1 (postgresql-9.6.1.tar.gz)), for instance ip address 10.0.0.1(a private address).
And AWS postgres RDS server "aws_rds_host_name" or any database IP address.
Error:
django.db.utils.OperationalError: FATAL: no pg_hba.conf entry for host "10.0.0.1", user "your_user", database "your_db", SSL off
Solution:
While installing the postgres client 9.6.1 source package in application server 10.0.0.1, we have to pass an argument "--with-openssl". I suggest to remove the existing the postgres client and install with below steps.
Download the postgres client source package 9.6.1 (postgresql-9.6.1.tar.gz)
Untar the package postgresql-9.6.1.tar.gz.
./configure --prefix="your_preferred_postgres_path_if_needed" --with-openssl (this '--with-openssl' argument is important to get rid of that error)
make
make install
After successful installation, that error didn't occur when we ran the django project with psycopg2.
I hope this solution helps someone.

Related

Ubuntu MYSQL cannot connect from python script

I need to create a mysql DB for my project. I have a ubuntu server and have followed this guide to install required modules:
https://www.javahelps.com/2018/10/install-mysql-with-phpmyadmin-on-ubuntu.html
After installing everything I can reach the phpmyadmin using the browser 192.168.3.146/phpmyadmin works without any issues:
phpmyadmin home screen
But the problem is when I try to reach the database through the python code, it does not work. My program hangs after mysql.connector.connect and will never print the next print statement.
print("trying MYSQL")
myConnection = mysql.connector.connect(host=192.168.3.146, user='test_user', passwd='test_user123', db='test', autocommit=True)
print("Connection ID:", myConnection)
print(myConnection)
I have previously sucesfully connected to the mysql this way to the mysql server which was created on Raspbian and did not have any issues. It seems that UBUNTU is not as straightforward.
Please can someone suggest me what could be the problem if I can easily reach the database through the web browser but python program fails
UPDATE
Trying out to comment out bind address in the configuration file but still no luck. The configuration file:
enter image description here
I have allowed firewall through port 3306 with the following command:
sudo ufw allow 3306
There is some progress. Now my Python program does not hang on the mysql connection but instead gives me error:
ERROR 1130 (HY000): Host '192.168.3.251' is not allowed to connect to this MySQL server
First of all, I am unsure where does this IP come from 192.168.3.251. The machine am using to connect to the database is configured with static IP and it is 192.168.4.200. I do not know why it says 192.168.3.251
Is the python script running from another machine? If so, maybe the problem is that mysql is listening only in localhost interface. You can change this by editing the file mysqld.cnf located in the /etc/mysql/mysql.conf.d/ folder and comment (with an #) the line that says:
bind-address = 127.0.0.1.
Once you've done this, restart the service this way:
$ sudo systemctl restart mysql.service
And, verify that everything is ok with:
$ systemctl status mysql.service

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)"

I've installed NGINX, GUNICORN and my project properly on Ubuntu server,
but when I run the project using
python manage.py runserver, I get the following error;
django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (111)"
Before, installing gunicorn, my site was running properly at my_public_ip_address:8000
check your mysql server is running or not
restart the mysql server
as asked before if you are running your website on a remote server, you should make sure that you add the ip address to the ALLOWED_HOSTS-list otherwise you might get another error.
Solutions could be:
Did you try to uninstall gunicorn? gunicorn is used later for the deployment of the website so it should actually be fine, as you are starting a development server with python manage.py runserver
As nginx is also used to ship your website into production if would assume that this should note be related directly to the database. you might want to check if nginx is running with service nginx status if this allocates the localhost port django can maybe not access the mysql database
Did you check the port config of your mysql database?
I had the same problem and just noticed that in my Linux home .bashrc file I had changed before
EXPORT DATABASE_HOST = 127.0.0.1
EXPORT DATABASE_PORT = 5432 # change here as 3306
When I changed these environment variables it worked.

Different errors coming from different host values for mysql config in docker project

I'm contributing to a new project, but getting info about the setup/build is difficult. I can get through these steps in the build process:
$ docker-machine create -d virtualbox dev;
$ eval $(docker-machine env dev)
$ docker-compose build
$ docker-compose up -d
The next command fails:
$ docker-compose run web /usr/local/bin/python manage.py migrate
...with this error:
(2005, "Unknown MySQL server host 'mysql' (0)")
When I change the mysql HOST from mysql to localhost, I get a new error:
(2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
I've read about each error, but the proposed solutions aren't relevant to my code (besides the suggestion of setting the HOST to localhost). Which host value is correct and what should be done about the respective error?
I'm not actually sure if mysql is running, where it should be running, and how to check its status.
I suspect that mysql is in another container, and project container is called "web" in the docker-compose.yml.
When you change mysql to localhost it will attempt to connect to local mysql in the web container (via linux socket) but of course it doesn't exist, because it has it's own container which I suspect is called mysql in docker-compose.yml.
To view the running containers you can use sudo docker ps, if mysql container is stopped/restarting you can investigate using docker logs <mysql container name/ID>.
If thats the case, try to look for mounts in the docker-compose.yml to investigate further.

Can MySQLdb on client machine connect to a database on a server machine?

I am not a network/web/internet programmer so please excuse my noobness in this area. I have gotten a website using a free hosting service. They include one MySQL database. Here are the details for the database:
port = 3306
host = "fdb4.biz.nf"
database = "1284899_6067"
user = "1284899_6067"
password = "somepass9351"
I am using MySQLdb module (installed on my CLIENT machine - not server) to connect to this database:
db = MySQLdb.connect(host=host, user=user, passwd=password, db=database,port=port)
But I get the following error:
OperationalError: (2003, "Can't connect to MySQL server on 'fdb4.biz.nf' (10060)
What I have already tried
tried two different databases from different hosts
tried changing the port
tried searching SO for similar answers but all others connect to 'local host'
What I think:
could this be caused by my firewall? I am using my school's internet. I don't think this could be it because I am on CLIENT so if anything it is the SERVER'S firewall.
Two questions
Can MySQLdb be used to connect to a db on a SERVER when it is imported on a CLIENT?
If yes, what am I doing wrong?
Thank you so much for any help, its greatly appreciated! Been stuck the whole day on this.
For security reasons, mysql only listens for connections from localhost. Error code 10060 is basically that: you are not allowed to connect remotely.
Solution: find a my.ini (or my.cnf in linux) and try to find a line:
bind-address = 127.0.0.1
this line says: allow only local connections. So, you should comment-out this line, or set your IP address.
Yes, MySQLdb can connect to remote hosts.
And your usage of the connect method is correct.
You should first check if you can connect to the remote mysql server from your mysql client.
In terminal you can type mysql -h hostname -u username -p databasename
This should prompt you for the password. Enter the password. Can you connect?
If you can't connect, then you have an access problem, and its not a python - mysqldb problem
Either the server is not reachable because it is behind a firewall, in that case your client machine's ip needs to be whitelisted. Check your firewall settings
Or, the mysql server running on the remote machine is configured to accept only local connections. I think this is the default, but I'm not sure. You should ssh into the server remote host where the database server is running, locate the my.cnf file on the server and check the settings. Depending on your mysql version, the configuration would look slightly different.
Or, the user that you're trying to connect as is not associated with the ip that you're trying to connect from. Mysql users have two parts, like this: 'username'#'host'. To enable a user to connect from all ips the user needs to look like this 'user'#'%'.
I hope I've given you enough to try to debug this issue.

Ubuntu server, postgresql, python, "Peer auth failed"

Hi I'm getting the following and the other solutions I've seen for this don't seem to be working...
Within the ubuntu server terminal (a virtualbox vm):
Error FATAL: Peer authentication failed for user "a4apps"
My Ubuntu server os user name is the same.
I have restarted my postgres.
I have tried changing my pg_hba.conf file by:
changing the IPv4 host method from md5 to "trust"
and by adding a line under it "host all all myubuntuserverip/32 trust"
I am trying to access it via a python script.
I am using psycopg
con = psycopg2.connect(database='fieldtest2', user='a4apps')
I created the user: sudo -u postgres create user a4apps
superuser no, create databases yes, create other users no.
Created database: sudo -u postgres createdb fieldtest2 -O a4apps
I was following this tutorial: here
I'm running out of ideas. Any guidance would be appreciated.
Thanks
Mike
This specific error message:
Peer authentication failed for user "a4apps"
means that the peer authentication method was selected per pg_hba.conf and that the connection attempt was not made by the OS user a4apps, contrary to what this auth method requires.
The default Ubuntu pg_hba.conf has these lines:
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
To allow local passwordless connections for any user except postgres, you may replace peer by trust in the last line.
The IPv4-related changes you tried in pg_hba.conf had no effect on your script because it doesn't connect through TCP/IP. If the connection string mentioned a hostname, it would then use TCP/IP and trigger the corresponding rules in pg_hba.conf.

Categories

Resources