Showing posts with label Database Instance. Show all posts
Showing posts with label Database Instance. Show all posts

Monday, March 7, 2016

Persisting Data Across Page Reloads: Cookies, IndexedDB and Everything In-Between

Suppose I’m visiting a web site. I right-click on one of the navigation links and select to open the link in a new window. What should happen? If I’m like most users, I expect the new page to have the same content as if I had clicked the link directly. The only difference should be that the page appears in a new window. But if your web site is a single-page application (SPA), you may see weird results unless you’ve carefully planned for this case.
Recall that in an SPA, a typical navigation link is often a fragment identifier, starting with a hash mark (#). Clicking the link directly does not reload the page, so all the data stored in JavaScript variables are retained. But if I open the link in a new tab or window, the browser does reload the page, reinitializing all the JavaScript variables. So any HTML elements bound to those variables will display differently, unless you’ve taken steps to preserve that data somehow.
Persisting Data Across Page Reloads: Cookies, IndexedDB and Everything In-Between
Persisting Data Across Page Reloads: Cookies, IndexedDB and Everything In-Between
There’s a similar issue if I explicitly reload the page, such as by hitting F5. You may think I shouldn’t ever need to hit F5, because you’ve set up a mechanism to push changes from the server automatically. But if I’m a typical user, you can bet I’m still going to reload the page. Maybe my browser seems to have repainted the screen incorrectly, or I just want to be certain I have the very latest stock quotes.

APIs May Be Stateless, Human Interaction Is Not

Unlike an internal request via a RESTful API, a human user’s interaction with a web site is not stateless. As a web user, I think of my visit to your site as a session, almost like a phone call. I expect the browser to remember data about my session, in the same way that when I call your sales or support line, I expect the representative to remember what was said earlier in the call.
An obvious example of session data is whether I’m logged in, and if so, as which user. Once I go through a login screen, I should be able to navigate freely through the user-specific pages of the site. If I open a link in a new tab or window and I’m presented with another login screen, that’s not very user friendly.
Another example is the contents of the shopping cart in an e-commerce site. If hitting F5 empties the shopping cart, users are likely to get upset.
In a traditional multi-page application written in PHP, session data would be stored in the $_SESSION superglobal array. But in an SPA, it needs to be somewhere on the client side. There are four main options for storing session data in an SPA:
  • Cookies
  • Fragment identifier
  • Web storage
  • IndexedDB

Four Kilobytes of Cookies

Cookies are an older form of web storage in the browser. They were originally intended to store data received from the server in one request and send it back to the server in subsequent requests. But from JavaScript, you can use cookies to store just about any kind of data, up to a size limit of 4 KB per cookie. AngularJS offers the ngCookies module for managing cookies. There is also a js-cookies package that provides similar functionality in any framework.
Keep in mind that any cookie you create will be sent to the server on every request, whether it’s a page reload or an Ajax request. But if the main session data you need to store is the access token for the logged-in user, you want this sent to the server on every request anyway. It’s natural to try to use this automatic cookie transmission as the standard means of specifying the access token for Ajax requests.
You may argue that using cookies in this manner is incompatible with RESTful architecture. But in this case it is just fine as each request via the API is still stateless, having some inputs and some outputs. It’s just that one of the inputs is being sent in a funny way, via a cookie. If you can arrange for the login API request to send the access token back in a cookie also, then your client side code hardly needs to deal with cookies at all. Again, it’s just another output from the request being returned in an unusual way.
Cookies offer one advantage over web storage. You can provide a “keep me logged in” checkbox on the login form. With the semantics, I expect if I leave it unchecked then I will remain logged in if I reload the page or open a link in a new tab or window, but I’m guaranteed to be logged out once I close the browser. This is an important safety feature if I’m using a shared computer. As we’ll see later, web storage does not support this behavior.
So how might this approach work in practice? Suppose you’re using LoopBack on the server side. You’ve defined a Person model, extending the built-in User model, adding the properties you want to maintain for each user. You’ve configured the Person model to be exposed over REST. Now you need to tweak server/server.js to achieve the desired cookie behavior. Below is server/server.js, starting from what was generated by slc loopback, with the marked changes:
var loopback = require('loopback');
var boot = require('loopback-boot');

var app = module.exports = loopback();

app.start = function() {
  // start the web server
  return app.listen(function() {
    app.emit('started');
    var baseUrl = app.get('url').replace(/\/$/, '');
    console.log('Web server listening at: %s', baseUrl);
    if (app.get('loopback-component-explorer')) {
      var explorerPath = app.get('loopback-component-explorer').mountPath;
      console.log('Browse your REST API at %s%s', baseUrl, explorerPath);
    }
  });
};

// start of first change
app.use(loopback.cookieParser('secret'));
// end of first change

// Bootstrap the application, configure models, datasources and middleware.
// Sub-apps like REST API are mounted via boot scripts.
boot(app, __dirname, function(err) {
  if (err) throw err;

  // start of second change
  app.remotes().after('Person.login', function (ctx, next) {
    if (ctx.result.id) {
      var opts = {signed: true};
      if (ctx.req.body.rememberme !== false) {
        opts.maxAge = 1209600000;
      }
      ctx.res.cookie('authorization', ctx.result.id, opts);
    }
    next();
  });
  app.remotes().after('Person.logout', function (ctx, next) {
    ctx.res.cookie('authorization', '');
    next();
  });
  // end of second change

  // start the server if `$ node server.js`
  if (require.main === module)
    app.start();
});
The first change configures the cookie parser to use ‘secret’ as the cookie signing secret, thereby enabling signed cookies. You need to do this because although LoopBack looks for an access token in either of the cookies ‘authorization’ or ‘access_token’, it requires that such a cookie be signed. Actually, this requirement is pointless. Signing a cookie is intended to ensure that the cookie hasn’t been modified. But there’s no danger of you modifying the access token. After all, you could have sent the access token in unsigned form, as an ordinary parameter. Thus, you don’t need to worry about the cookie signing secret being hard to guess, unless you’re using signed cookies for something else.
The second change sets up some postprocessing for the Person.login and Person.logout methods. For Person.login, you want to take the resulting access token and send it to the client as the signed cookie ‘authorization’ also. The client may add one more property to the credentials parameter, rememberme, indicating whether to make the cookie persistent for 2 weeks. The default is true. The login method itself will ignore this property, but the postprocessor will check it.
For Person.logout, you want to clear out this cookie.
You can see the results of these changes right away in the StrongLoop API Explorer. Normally after a Person.login request, you would have to copy the access token, paste it into the form at the top right, and click Set Access Token. But with these changes, you don’t have to do any of that. The access token is automatically saved as the cookie ‘authorization’, and sent back on each subsequent request. When the Explorer is displaying the response headers from Person.login, it omits the cookie, because JavaScript is never allowed to see Set-Cookie headers. But rest assured, the cookie is there.
On the client side, on a page reload you would see if the cookie ‘authorization’ exists. If so, you need to update your record of the current userId. Probably the easiest way to do this is to store the userId in a separate cookie on successful login, so you can retrieve it on a page reload.

The Fragment Identifier

As I’m visiting a web site that has been implemented as an SPA, the URL in my browser’s address bar might look something like “https://example.com/#/my-photos/37”. The fragment identifier portion of this, “#/my-photos/37”, is already a collection of state information that could be viewed as session data. In this case, I’m probably viewing one of my photos, the one whose ID is 37.
You may decide to embed other session data within the fragment identifier. Recall that in the previous section, with the access token stored in the cookie ‘authorization’, you still needed to keep track of the userId somehow. One option is to store it in a separate cookie. But another approach is to embed it in the fragment identifier. You could decide that while I’m logged in, all the pages I visit will have a fragment identifier beginning with “#/u/XXX”, where XXX is the userId. So in the previous example, the fragment identifier might be “#/u/59/my-photos/37” if my userId is 59.
Theoretically, you could embed the access token itself in the fragment identifier, avoiding any need for cookies or web storage. But that would be a bad idea. My access token would then be visible in the address bar. Anyone looking over my shoulder with a camera could take a snapshot of the screen, thereby gaining access to my account.
One final note: it is possible to set up an SPA so that it doesn’t use fragment identifiers at all. Instead it uses ordinary URLs like “http://example.com/app/dashboard” and “http://example.com/app/my-photos/37”, with the server configured to return the top level HTML for your SPA in response to a request for any of these URLs. Your SPA then does its routing based on the path (e.g. “/app/dashboard” or “/app/my-photos/37”) instead of the fragment identifier. It intercepts clicks on navigation links, and uses History.pushState() to push the new URL, then proceeds with routing as usual. It also listens for popstate events to detect the user clicking the back button, and again proceeds with routing on the restored URL. The full details of how to implement this are beyond the scope of this article. But if you use this technique, then obviously you can store session data in the path instead of the fragment identifier.

Web Storage

Web storage is a mechanism for JavaScript to store data within the browser. Like cookies, web storage is separate for each origin. Each stored item has a name and a value, both of which are strings. But web storage is completely invisible to the server, and it offers much greater storage capacity than cookies. There are two types of web storage: local storage and session storage.
An item of local storage is visible across all tabs of all windows, and persists even after the browser is closed. In this respect, it behaves somewhat like a cookie with an expiration date very far in the future. Thus, it is suitable for storing an access token in the case where the user has checked “keep me logged in” on the login form.
An item of session storage is only visible within the tab where it was created, and it disappears when that tab is closed. This makes its lifetime very different from that of any cookie. Recall that a session cookie is still visible across all tabs of all windows.
If you use the AngularJS SDK for LoopBack, the client side will automatically use web storage to save both the access token and the userId. This happens in the LoopBackAuth service in js/services/lb-services.js. It will use local storage, unless the rememberMe parameter is false (normally meaning the “keep me logged in” checkbox was unchecked), in which case it will use session storage.
The result is that if I log in with “keep me logged in” unchecked, and I then open a link in a new tab or window, I won’t be logged in there. Most likely I’ll see the login screen. You can decide for yourself whether this is acceptable behavior. Some might consider it a nice feature, where you can have several tabs, each logged in as a different user. Or you might decide that hardly anyone uses shared computers any more, so you can just omit the “keep me logged in” checkbox altogether.
So how would the session data handling look if you decide to go with the AngularJS SDK for LoopBack? Suppose you have the same situation as before on the server side: you’ve defined a Person model, extending the User model, and you’ve exposed the Person model over REST. You won’t be using cookies, so you won’t need any of the changes described earlier.
On the client side, somewhere in your outermost controller, you probably have a variable like $scope.currentUserId which holds the userId of the currently logged in user, or null if the user is not logged in. Then to handle page reloads properly, you just include this statement in the constructor function for that controller:
$scope.currentUserId = Person.getCurrentId();
It’s that easy. Add ‘Person’ as a dependency of your controller, if it isn’t already.

IndexedDB

IndexedDB is a newer facility for storing large amounts of data in the browser. You can use it to store data of any JavaScript type, such as an object or array, without having to serialize it. All requests against the database are asynchronous, so you get a callback when the request is completed.
You might use IndexedDB to store structured data that’s unrelated to any data on the server. An example might be a calendar, a to-do list, or saved games that are played locally. In this case, the application is really a local one, and your web site is just the vehicle for delivering it.
At present, Internet Explorer and Safari only have partial support for IndexedDB. Other major browsers support it fully. One serious limitation at the moment, though, is that Firefox disables IndexedDB entirely in private browsing mode.
As a concrete example of using IndexedDB, let’s take the sliding puzzle application by Pavol Daniš, and tweak it to save the state of the first puzzle, the Basic 3x3 sliding puzzle based on the AngularJS logo, after each move. Reloading the page will then restore the state of this first puzzle.
I’ve set up a fork of the repository with these changes, all of which are in app/js/puzzle/slidingPuzzle.js. As you can see, even a rudimentary usage of IndexedDB is quite involved. I’ll just show the highlights below. First, the function restore gets called during page load, to open the IndexedDB database:
/*
 * Tries to restore game
 */
this.restore = function(scope, storekey) {
    this.storekey = storekey;
    if (this.db) {
        this.restore2(scope);
    }
    else if (!window.indexedDB) {
        console.log('SlidingPuzzle: browser does not support indexedDB');
        this.shuffle();
    }
    else {
        var self = this;
        var request = window.indexedDB.open('SlidingPuzzleDatabase');
        request.onerror = function(event) {
            console.log('SlidingPuzzle: error opening database, ' + request.error.name);
            scope.$apply(function() { self.shuffle(); });
        };
        request.onupgradeneeded = function(event) {
            event.target.result.createObjectStore('SlidingPuzzleStore');
        };
        request.onsuccess = function(event) {
            self.db = event.target.result;
            self.restore2(scope);
        };
    }
};
The request.onupgradeneeded event handles the case where the database doesn’t exist yet. In this case, we create the object store.
Once the database is open, the function restore2 is called, which looks for a record with a given key (which will actually be the constant ‘Basic’ in this case):
/*
 * Tries to restore game, once database has been opened
 */
this.restore2 = function(scope) {
    var transaction = this.db.transaction('SlidingPuzzleStore');
    var objectStore = transaction.objectStore('SlidingPuzzleStore');
    var self = this;
    var request = objectStore.get(this.storekey);
    request.onerror = function(event) {
        console.log('SlidingPuzzle: error reading from database, ' + request.error.name);
        scope.$apply(function() { self.shuffle(); });
    };
    request.onsuccess = function(event) {
        if (!request.result) {
            console.log('SlidingPuzzle: no saved game for ' + self.storekey);
            scope.$apply(function() { self.shuffle(); });
        }
        else {
            scope.$apply(function() { self.grid = request.result; });
        }
    };
}
If such a record exists, its value replaces the grid array of the puzzle. If there is any error in restoring the game, we just shuffle the tiles as before. Note that grid is a 3x3 array of tile objects, each of which is fairly complex. The great advantage of IndexedDB is that you can store and retrieve such values without having to serialize them.
We use $apply to inform AngularJS that the model has been changed, so the view will be updated appropriately. This is because the update is happening inside a DOM event handler, so AngularJS wouldn’t otherwise be able to detect the change. Any AngularJS application using IndexedDB will probably need to use $apply for this reason.
After any action that would change the grid array, such as a move by the user, the function save is called which adds or updates the record with the appropriate key, based on the updated grid value:
/*
 * Tries to save game
 */
this.save = function() {
    if (!this.db) {
        return;
    }
    var transaction = this.db.transaction('SlidingPuzzleStore', 'readwrite');
    var objectStore = transaction.objectStore('SlidingPuzzleStore');
    var request = objectStore.put(this.grid, this.storekey);
    request.onerror = function(event) {
        console.log('SlidingPuzzle: error writing to database, ' + request.error.name);
    };
    request.onsuccess = function(event) {
        // successful, no further action needed
    };
}
The remaining changes are to call the above functions at appropriate times. You can review the commitshowing all of the changes. Note that we are calling restore only for the basic puzzle, not for the three advanced puzzles. We exploit the fact that the three advanced puzzles have an api attribute, so for those we just do the normal shuffling.
What if we wanted to save and restore the advanced puzzles also? That would require some restructuring. In each of the advanced puzzles, the user can adjust the image source file and the puzzle dimensions. So we’d have to enhance the value stored in IndexedDB to include this information. More importantly, we’d need a way to update them from a restore. That’s a bit much for this already lengthy example.

Conclusion

In most cases, web storage is your best bet for storing session data. It’s fully supported by all major browsers, and it offers much greater storage capacity than cookies.
You would use cookies if your server is already set up to use them, or if you need the data to be accessible across all tabs of all windows, but you also want to ensure it will be deleted when the browser is closed.
You already use the fragment identifier to store session data that’s specific to that page, such as the ID of the photo the user is looking at. While you could embed other session data in the fragment identifier, this doesn’t really offer any advantage over web storage or cookies.
Using IndexedDB is likely to require a lot more coding than any of the other techniques. But if the values you’re storing are complex JavaScript objects that would be difficult to serialize, or if you need a transactional model, then it may be worthwhile.
This post originally appeared in Toptal Engineering Blog

Saturday, September 3, 2011

What is a Schema in Oracle ?


It may sound like an easy question, but the answer isn’t always clear to everyone, so I intend to clarify it in this post.
Most users think that, when they are developing an application, what they need is a database. Wrong. What they are looking for is a schema (or maybe a set of schemas), but almost no database needs a schema for itself.
A schema is a collection of database objets, owned by a single database user. The name of the schema is the same as the name of the user. The objets in this schemas can be in different tablespaces, because there is no direct relationship between a tablespace and a schema.
On the other hand, we can have a user that doesn’t owns a schema, but has grants to work with it. That’s a clear example of the differences between a schema and an user: a schema is always owned by an user, but an user doesn’t have to own a schema.
Or better said: a user that doesn’t owns a schema, what really owns is an empty schema. Because he can eventually have some object owned by him, so the schema is still there.
However, remember that a schema is a set of database objects, so… ¿a null collection of objects is still considered a collection of objects? That depends on the point of view, but anyway, an empty schema doesn’t have any interest for us.
I hope that this post has made a clearer perspective of what a schema is, and to know the differences between a schema and a database.

Wednesday, July 6, 2011

How to install two installing Oracle database on a host

Hi Team,

Here i am sharing the experience of installing two oracle database on same host.

After installing new database my first database won't come up.there are some problems with listener.ora and tnsnames.ora so you have to follow this approach...

dbsid1 existing Database
dbsid2 New Database

Changes in listener.ora
################
# Filename......: listener.ora for more than one database
# Created.......: created by SAP AG, R/3 Rel. >= 4.0A
# Name..........:
# Date..........:
################
LISTENER =
(ADDRESS_LIST =
(ADDRESS=
(PROTOCOL=IPC)
(KEY= dbsid1.WORLD)
)
(ADDRESS=
(PROTOCOL=IPC)
(KEY= dbsid1)
)
(ADDRESS=
(PROTOCOL=IPC)
(KEY= dbsid2.WORLD)
)
(ADDRESS=
(PROTOCOL=IPC)
(KEY= dbsid2)
)
(ADDRESS =
(COMMUNITY = SAP.WORLD)
(PROTOCOL = TCP)
(HOST = DBHOSTNAME)
(PORT = 1527)
)
)
STARTUP_WAIT_TIME_LISTENER = 0
CONNECT_TIMEOUT_LISTENER = 10
TRACE_LEVEL_LISTENER = OFF
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SDU = 32768)
(SID_NAME = dbsid1)
(ORACLE_HOME = ORACLE_HOME_dbsid1)
(PRESPAWN_MAX = 10)
)
(SID_DESC =
(SDU = 32768)
(SID_NAME = dbsid2)
(ORACLE_HOME = ORACLE_HOME_dbsid2)
(PRESPAWN_MAX = 10)
)
)


and tnsnames.ora should be like this:
################
# Filename......: tnsnames.ora
# Name..........: LOCAL_REGION.world
# Date..........:
################
dbsid1.world =
(DESCRIPTION =
(SDU = 4096)
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = sap.world)
(PROTOCOL = TCP)
(HOST = DBHOSTNAME)
(PORT = 1527)
)
)
(CONNECT_DATA =
(SID = dbsid1)
(GLOBAL_NAME = dbsid1.world)
)
)
dbsid2.world =
(DESCRIPTION =
(SDU = 4096)
(ADDRESS_LIST =
(ADDRESS =
(COMMUNITY = sap.world)
(PROTOCOL = TCP)
(HOST = DBHOSTNAME)
(PORT = 1527)
)
)
(CONNECT_DATA =
(SID = dbsid2)
(GLOBAL_NAME = dbsid2.world)
)
)


I think it will help you.

For more clarity follow SAP Note 98252

Friday, June 10, 2011

Installing SAP R/3 Application server on Linux

In this article, I will give you step by step for installation of application server system SAP R / 3 using the Linux OS. Why use Linux? Instead better use Windows? There are some things that a consideration to me why using Linux include:


  1. Database Instance that will be used is Oracle with a platform AIX (IBM's proprietary UNIX). Between AIX and Linux, UNIX machines are equally so compatibility will be more awake than using Windows.
  2. Linux is free and open source. By nature, I was much easier to perform tuning and search for references on the Internet.
  3. Communication between Linux and AIX will use NFS, while Windows and AIX will use SAMBA.
  4. Linux machine is more stable, reliable, and most importantly the virus-immune.
  5. Linux is also less expensive in terms of maintenance, hardware requirements, compared to using Windows (must have a license) and AIX (in terms of licensing and hardware).
Selection of Linux distributions that will be used freely. I prefer the distro that can use the concept of LVM (Logical Volume Management) so I can make a logical volume space maintenance easier. I will try to explain using Redhat machine. I personally have tried to use SuSE as well. The main difference between them is the problem of the default file system used. Redhat uses ext3, while SuSE using reiserfs.

Excellence ext3 and reiserfs is the ability to manage the logical volume size online.So we can easily increase the size of logical volumes without having to unmount the logical volume.We start, yes ...

1. OS InstallationWhen the OS installation, prepare a sufficient partition for the installation of SAP. The table on the following attachment (Disk) The following will give an explanation setting partitions using LVM.

2. Installing the Central InstanceSince we will use an existing Database Instance on AIX 64 bit machine, then we have to install the Central Instance. Installing the Central Instance package in Linux is to get the executable files from the SAP kernel for Linux.
Set environment needed to run sapinst among others:
LD_LIBRARY_PATH = / sapmnt / [SID] / exeSAPINST_JRE_HOME = / opt / [location of java runtime environment]DISPLAY = [IP_Address of Windows Client]: 0.0umask = 22

To test, run the xclock command on the console. If an analog clock image, it means that environment is set correctly. If not appear, review the value of each environment variable you.




Go to the directory sapinst. Sapinst Run command on the console.


Choose Install Central Instance.


Fill in the information to the SAP System ID (SAPSID) and Instance Number.Customize with existing information on the Database Instance on AIX.


Fill in the information database ID (DBSID) and Database Host.


Let the information by default. This we do because this server will only be used asapplication servers.


Choose No if you do not use LDAP LDAP facilities on your network.


Make sure that this directory is exist.


Make sure the correct information Database Schema. And do not forget the type ofdatabase server is running on AIX is 64 bits.


Information about the group sapsys. Noteworthy is the Group ID must match the Group ID on the AIX machine (as a database server).


Information about the group dba. Noteworthy is the Group ID must match the Group IDon the AIX machine (as a database server).


Information about the group shift gears. Noteworthy is the Group ID must match the Group ID on the AIX machine (as a database server).


Information about the user [sid] adm. Must be considered is the User ID andpassword must be the same as your User ID and password on AIX machine.


Information about the user ora [sid]. Must be considered is the User ID and passwordmust be the same as your User ID and password on AIX machines.


Note the directory listing above. These directories must exist. If not exist, create itnow!. The directory must exist is / usr / sap, / usr / sap / trans, / sapmnt, / oracle, /oracle / [SID] / 920_64.


You must indicate the location of the SAP Kernel for Linux is available. You should be ready.


Information extraction of Oracle Client. Remove the check mark. We will not installOracle Client now.


Information on ports used by SAP applications. The following ports should not beused by other applications, which is 36 [system number], 33 [system number], 32[system number], 47 [system number], and 48 [system number]. Please edit the file /etc / services.


Information listener name and port used by the listener. Make sure the port is not usedby other applications.


Show location IGS_SOFT.


Summary information on the Central Instance installation. Check back and you stillcan click the back button if there is not yet appropriate.


Installing the central instance is running.


Congratulations!! Installing the central instance successfully. We're already in half way.Please break before ... enjoy hot coffee and fried bananas you ...:)

3. Installing Dialog Instance

Set environment needed to run sapinst among others:

LD_LIBRARY_PATH = / sapmnt / [SID] / exe
SAPINST_JRE_HOME = / opt / [location of java runtime environment]
DISPLAY = [IP_Address of Windows Client]: 0.0
umask = 22

To test, run the xclock command on the console. If an analog clock image, it means that environment is set correctly. If not appear, review the value of each environment variable you.
Make sure the machine Linux and AIX machines know each other. Perform the addition of the IP Address and hostname Linux on AIX machines and vice versa.

From the AIX machine via NFS, shared directory / sapmnt / [SID] / global and /sapmnt / [SID] / profile. From the Linux machine, mount the directory with the samemount point.


Screen installation election. Select Non-Unicode_Install Dialog Instance.

Information about the Central Instance. Remember! instance number and instanceinformation are hosted on the AIX machine.


Information Database ID (DBSID) and Database Host.


Information hosted instance of parameters. Leave the default.


Choose No if you do not use LDAP LDAP on the network.


Location SAP Mount Directory is on / sapmnt. Make sure this directory exists.


Note the type of information Database Schema and Database servers. Do not forgetthat the database server that we use is 64 bits.


Note the directory listing above. These directories must exist. If not exist, create itnow!. The directory must exist is / usr / sap, / usr / sap / trans, / sapmnt, / oracle, /oracle / [SID] / 920_64.


You must indicate the location of the SAP Kernel for Linux is available. You should be ready.


Now is the time for us to install Oracle Client. Tick ​​the option extract oracle client.


Information used ports in the SAP. Should have been prepared at the time ofinstallation of the Central Instance.


Setting name of the listener and the listener port name.


Location IGS_SOFT.


Installation Summary Dialog Instance.

Installing Dialog Instance is running.


Error will be out due to lack of permissions on the directory NFS / sapmnt / [SID] /profile.


From the AIX machine, change the first permissions recursively to 777, the command# chmod-R / sapmnt / [SID] / profile. Continue the installation until it met the error again.


Errors occur because the permissions on the directory NFS / sapmnt / [SID] / profileon AIX machines.


Restore permissions to its original position. Use the following commands in succession: # chmod-R 644 profile, # chmod 755 profile.


This error is a bug from SAP. Please edit the file keybd.xml. Search keyword"ERROR" and change it to OK. Save, then run back to the old installation.


Congratulations! Dialog Instance installation has been completed.

4. Next run the dialog instance. Previous sure central instance and database server is running on the AIX machine.

Now we already have a Linux application servers are cheap, reliable and stable.There is more to be dituning, later we went on again.