இரு கிளையண்ட்களும் ஒரே மடிக்கணினியில் உள்ளன, ஒரே சுரங்கப்பாதை வழியாகச் செல்கின்றன, அவற்றில் ஒன்று மட்டுமே இணைக்கிறது. அந்த ஒப்பீடு VPN தேர்ந்தெடுத்து செயல்படுவதற்கான ஆதாரமாகத் தோன்றுகிறது, ஆனால் மிகவும் பொதுவான விளக்கம் இரு கிளையண்ட்களும் வெவ்வேறு இலக்குகளை அணுகுகின்றன என்பதே. ஒரு GUI தனது சொந்த ஹோஸ்ட், போர்ட், பங்கு மற்றும் TLS அமைப்புகளை வைத்துக்கொண்டு தேவைப்படும்போது அமைதியாக SSH முன்னனுப்பலை உருவாக்குகிறது, அதேசமயம் psql உங்கள் ஷெல் ஏற்கனவே அமைத்திருக்கக்கூடிய libpq இயல்புநிலைகளிலிருந்து இணைப்பைக் கூட்டுகிறது. வேலை செய்யும் இணைப்பை மீண்டும் உருவாக்குவது GUI அமைப்புகளைப் படிப்பதே தவிர, சுரங்கப்பாதையை மீண்டும் நிறுவுவது அல்ல.

புராணம்: ஒரு வேலை செய்யும் கிளையண்ட் பாதையை நிரூபிக்கிறது

GUI இணைந்தால் சுரங்கப்பாதை போக்குவரத்தை எடுத்துச் செல்கிறது, GUI நிரூபிப்பது அவ்வளவே. psql எந்த முகவரியைத் தீர்க்கிறது, எந்தப் பங்கில் அங்கீகரிக்கிறது, அல்லது அது திறக்கும் சாக்கெட் எப்போதாவது இயந்திரத்தை விட்டு வெளியேறுகிறதா என்பதைப் பற்றி எதுவும் கூறுவதில்லை. பாதை பகிரப்பட்டது; அளவுருக்கள் அல்ல.

உள்ளூர் முன்னனுப்பல் இடைவெளியை விரிவாக்குகிறது. GUI SSH வழியாக முன்னனுப்பிய போர்ட்டில் 127.0.0.1 உடன் இணையலாம், அந்தக் கேட்பவர் GUI அமர்வு நீடிக்கும் வரை மட்டுமே இருக்கும். முன்னனுப்பல் இல்லாமல் localhost நோக்கிச் செல்லும் psql, VPN உடன் எந்தத் தொடர்பும் இல்லாத நிராகரிக்கப்பட்ட இணைப்பைப் பெறுகிறது.

GUI உண்மையில் பயன்படுத்தும் முடிவுப்புள்ளியைப் படியுங்கள்

இணைப்பின் பண்புகளைத் திறந்து நான்கு மதிப்புகளை நகலெடுக்கவும்: ஹோஸ்ட், போர்ட், தரவுத்தளம் மற்றும் பங்கு. பின்னர் சுரங்கப்பாதை தாவலைத் தேடுங்கள், ஏனெனில் SSH முன்னனுப்பல் தனிப்பட்ட முகவரியை உள்ளூர் போர்ட்டாக மாற்றி psql க்குச் சொல்ல வேண்டியதை மாற்றுகிறது.

SettingWhat the GUI holdsWhat psql uses when the value is absent
DestinationA saved hostname, sometimes behind a forwardA local Unix socket, not the remote endpoint
PortThe direct port or a forwarded local port5432, or the port from a service file
Role and databaseStored per connection profileYour operating-system user name
TLS identityIts own CA bundle and verification modeWhatever PGSSLMODE or the service file says
Startup filesNot read at allRead unless -X is passed

ஒவ்வொரு வரிசையும் வெவ்வேறு அடுக்கில் தோல்வியடைகிறது, நீங்கள் பெறும் செய்தி அந்த அடுக்கைப் பெயரிடுகிறது. சேமித்த சுயவிவரத்தின் நட்புப் பெயரை psql இல் ஒட்டுவது மேலே உள்ள எந்த மதிப்பையும் கொண்டு செல்லாது, சேவைப் பெயர் முனையம் ஒருபோதும் படிக்காத கோப்பின் வழியாகத் தீர்க்கப்படுகிறது.

libpq உங்கள் ஷெல்லிலிருந்து எதை மரபுரிமையாகப் பெறுகிறது

psql என்பது libpq மீதான மெல்லிய கிளையண்ட், libpq வேறு எதையும் படிப்பதற்கு முன் சூழலைப் படிக்கிறது. PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE மற்றும் PGSSLMODE போன்ற மாறிகள் ஒவ்வொன்றும் இணைப்பின் ஒரு பகுதியை வேறு திசைக்குத் திருப்பலாம். அவை தட்டச்சு செய்யப்படுவதற்குப் பதிலாக மரபுரிமையாக வருகின்றன, எனவே நீங்கள் இயக்கிய கட்டளையில் எதுவும் அவற்றைக் காட்டாது. ஏற்றுமதி செய்யப்பட்ட PGSSLMODE உம் கட்டளை வரியில் ஒரு வார்த்தையும் இல்லாமல் கிளையண்ட் எதை ஏற்கிறது என்பதை மாற்றலாம்.

அந்த மாறிகளில் இரண்டு முதலில் சந்தேகத்திற்குரியவை. PGHOSTADDR பெயர் தீர்வை மீறும் எண்ணியல் இலக்கை வழங்குகிறது, அதேசமயம் ஹோஸ்ட் பெயர் இன்னும் சான்றிதழ் அடையாளத்தை தீர்மானிக்கிறது, PGSERVICE சேவைக் கோப்பிலிருந்து ஹோஸ்ட், தரவுத்தளம் மற்றும் TLS தேர்வுகளை இழுக்கிறது. இதைப் பிழைதிருத்த முழு சூழலையும் கொட்டுவது மோசமான பழக்கம், ஏனெனில் அதில் கடவுச்சொற்கள் மற்றும் தொடர்பற்ற டோக்கன்கள் இருக்கலாம்; அதற்குப் பதிலாக உங்களுக்கு முக்கியமான மாறிகளைத் தேர்ந்தெடுங்கள்.

host மற்றும் hostaddr இரண்டையும் விட்டுவிட்டால் பிணைய முகவரிக்குப் பதிலாக Unix களச் சாக்கெட் தேர்ந்தெடுக்கப்படுகிறது. எனவே -h இல்லாத psql அழைப்பு உள்ளூரில் வெற்றிபெறலாம், அல்லது சாக்கெட் பிழையுடன் தோல்வியடையலாம், GUI பயன்படுத்தும் பாதையை ஒருபோதும் தொடாமல்.

அதே அளவுருக்களைக் கையால் அனுப்புங்கள்

GUI மதிப்புகள் கையில் இருக்கும்போது அவற்றை வெளிப்படையாக அனுப்பி, மேலெழுதல்களைச் சேர்க்கக்கூடிய தொடக்கக் கோப்பைத் தவிர்க்கவும். கீழே உள்ள இணைப்புச் சரம் எடுத்துக்காட்டு: முடிவுப்புள்ளி, போர்ட், தரவுத்தளம் மற்றும் பங்கை உங்கள் நிர்வாகி அங்கீகரித்த மதிப்புகளால் மாற்றி, ஏற்கனவே வேலை செய்யும் நம்பிக்கை உள்ளமைவை வைத்திருங்கள்.

psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"

அந்தக் கட்டளையில் மூன்று விவரங்கள் வேண்டுமென்றே உள்ளன. -X psql இன் தொடக்கக் கோப்பை அடக்குகிறது, ஆனால் libpq சூழல் அல்லது சேவை வரையறையை அடக்கவில்லை. connect_timeout=5 காலி பாதை முனையத்தை நிமிடங்கள் தொங்கவிடுவதைத் தடுக்கிறது. sslmode=verify-full சான்றிதழ் மற்றும் ஹோஸ்ட் பெயர் சரிபார்ப்புகளை இயக்கத்தில் வைத்திருக்கிறது, TLS பிழை தோன்றும்போது மக்கள் அணைப்பது சரியாக அந்தப் பகுதியே.

அங்கீகரிக்கப்பட்ட முடிவுப்புள்ளி ஒரு pooler க்குப் பின்னால் இருந்தால், போர்ட் 6432 மற்றும் போர்ட் 5432 வெவ்வேறு சேவையக அடையாளங்கள் வழியாக அதே தரவை அடையலாம், சரிபார்ப்பு தரவுத்தளத்தின் பெயரில் அல்ல, pooler இன் பெயரில் தோல்வியடையலாம். பயன்முறையை பலவீனப்படுத்துவதற்குப் பதிலாக இணைப்புச் சரத்தில் பெயரைச் சரிசெய்யுங்கள்.

அடுத்த படியை பிழைச் செய்தி தேர்ந்தெடுக்கட்டும்

தோல்வியின் உரை முயற்சி எவ்வளவு தூரம் சென்றது என்பதைக் கூறுகிறது, அது சுரங்கப்பாதை பற்றிய எந்த ஊகத்தையும் மிஞ்சுகிறது. தீர்க்க முடியாத பெயர் சாக்கெட் உருவாவதற்கு முன்பே தோல்வியடைகிறது, நேரம் முடிவது பாதை அல்லது ஃபயர்வால் பாக்கெட்டுகளை விட்டது என்று பொருள், நிராகரிப்பு ஏதோ பதிலளித்து மறுத்தது என்று பொருள், அங்கீகாரப் பிழை பிணையம் ஏற்கனவே வேலை செய்தது என்று பொருள்.

psql -X -w "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5" -c '\conninfo'
env | grep -E '^PG'
psql --version

\conninfo இன் வெளியீட்டை GUI இன் நேரடி அமர்வுடன் ஒப்பிடுங்கள்: அதே ஹோஸ்ட், அதே போர்ட், அதே பங்கு, அதே TLS நிலை. இந்த நான்கும் பொருந்தினால், VPN க்கு விளக்க எதுவும் மிச்சமில்லை. அவை பொருந்தும் வரை, சுரங்கப்பாதையில் ஒவ்வொரு கூடுதல் மாற்றமும் முனையம் ஒருபோதும் செய்யாத இணைப்பு பற்றிய ஊகமே.

தொடர்புடைய கட்டுரைகள்